当前位置: 首页 > news >正文

我要找人做网站的主页wordpress首页友情链接

我要找人做网站的主页,wordpress首页友情链接,深圳市涂能装饰设计公司网站,实惠网站建设前言 ​学习视频#xff1a;​Java项目《谷粒商城》架构师级Java项目实战#xff0c;对标阿里P6-P7#xff0c;全网最强​学习文档#xff1a; 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…前言 ​学习视频​Java项目《谷粒商城》架构师级Java项目实战对标阿里P6-P7全网最强​学习文档 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个人笔记(高级篇二)谷粒商城-个人笔记(高级篇三)谷粒商城-个人笔记(高级篇四)谷粒商城-个人笔记(高级篇五)谷粒商城-个人笔记(集群部署篇一) ​3. 接口文档https://easydoc.net/s/78237135/ZUqEdvA4/hKJTcbfd 4. 本内容仅用于个人学习笔记如有侵扰联系删 ​ 一、k8s 集群部署 1、k8s 快速入门 1.1、简介 Kubernetes 简称 k8s。是用于自动部署扩展和管理容器化应用程序的开源系统。 中文官网https://kubernetes.io/zh/ 中文社区https://www.kubernetes.org.cn/ 官方文档https://kubernetes.io/zh/docs/home/ 社区文档http://docs.kubernetes.org.cn/ 部署方式的进化 https://kubernetes.io/zh/docs/concepts/overview/ 传统部署时代 早期各个组织是在物理服务器上运行应用程序。 由于无法限制在物理服务器中运行的应用程序资源使用因此会导致资源分配问题。 例如如果在同一台物理服务器上运行多个应用程序 则可能会出现一个应用程序占用大部分资源的情况而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上 但是当某个应用程序资源利用率不高时剩余资源无法被分配给其他应用程序 而且维护许多物理服务器的成本很高。 虚拟化部署时代 因此虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机VM。 虚拟化能使应用程序在不同 VM 之间被彼此隔离且能提供一定程度的安全性 因为一个应用程序的信息不能被另一应用程序随意访问。 虚拟化技术能够更好地利用物理服务器的资源并且因为可轻松地添加或更新应用程序 而因此可以具有更高的可扩缩性以及降低硬件成本等等的好处。 通过虚拟化你可以将一组物理资源呈现为可丢弃的虚拟机集群。 每个 VM 是一台完整的计算机在虚拟化硬件之上运行所有组件包括其自己的操作系统。 容器部署时代 容器类似于 VM但是更宽松的隔离特性使容器之间可以共享操作系统OS。 因此容器比起 VM 被认为是更轻量级的。且与 VM 类似每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离因此可以跨云和 OS 发行版本进行移植。 容器因具有许多优势而变得流行起来例如 敏捷应用程序的创建和部署与使用 VM 镜像相比提高了容器镜像创建的简便性和效率。持续开发、集成和部署通过快速简单的回滚由于镜像不可变性 提供可靠且频繁的容器镜像构建和部署。关注开发与运维的分离在构建、发布时创建应用程序容器镜像而不是在部署时 从而将应用程序与基础架构分离。可观察性不仅可以显示 OS 级别的信息和指标还可以显示应用程序的运行状况和其他指标信号。跨开发、测试和生产的环境一致性在笔记本计算机上也可以和在云中运行一样的应用程序。跨云和操作系统发行版本的可移植性可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。以应用程序为中心的管理提高抽象级别从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。松散耦合、分布式、弹性、解放的微服务应用程序被分解成较小的独立部分 并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。资源隔离可预测的应用程序性能。资源利用高效率和高密度。 为什么需要 Kubernetes它能做什么 以前使用Swarm Mode方式调度功能简单现在使用Kubernetes 容器是打包和运行应用程序的好方式。在生产环境中 你需要管理运行着应用程序的容器并确保服务不会下线。 例如如果一个容器发生故障则你需要启动另一个容器。 如果此行为交由给系统处理是不是会更容易一些 这就是 Kubernetes 要来做的事情 Kubernetes 为你提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移你的应用、提供部署模式等。 例如Kubernetes 可以轻松管理系统的 Canary (金丝雀) 部署。 Kubernetes 为你提供 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大 Kubernetes 可以负载均衡并分配网络流量从而使部署稳定。 存储编排 Kubernetes 允许你自动挂载你选择的存储系统例如本地存储、公共云提供商等。 自动部署和回滚 你可以使用 Kubernetes 描述已部署容器的所需状态 它可以以受控的速率将实际状态更改为期望状态。 例如你可以自动化 Kubernetes 来为你的部署创建新容器 删除现有容器并将它们的所有资源用于新容器。 自动完成装箱计算 你为 Kubernetes 提供许多节点组成的集群在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上以最佳方式利用你的资源。 自我修复 Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器 并且在准备好服务之前不将其通告给客户端。 密钥与配置管理 Kubernetes 允许你存储和管理敏感信息例如密码、OAuth 令牌和 SSH 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置也无需在堆栈配置中暴露密钥。 批处理执行 除了服务外Kubernetes 还可以管理你的批处理和 CI持续集成工作负载如有需要可以替换失败的容器。 水平扩缩 使用简单的命令、用户界面或根据 CPU 使用率自动对你的应用进行扩缩。 IPv4/IPv6 双栈 为 Pod容器组和 Service服务分配 IPv4 和 IPv6 地址。 为可扩展性设计 在不改变上游源代码的情况下为你的 Kubernetes 集群添加功能。 Kubernetes 不是什么 Kubernetes 不是传统的、包罗万象的 PaaS平台即服务系统。 由于 Kubernetes 是在容器级别运行而非在硬件级别它提供了 PaaS 产品共有的一些普遍适用的功能 例如部署、扩展、负载均衡允许用户集成他们的日志记录、监控和警报方案。 但是Kubernetes 不是单体式monolithic系统那些默认解决方案都是可选、可插拔的。 Kubernetes 为构建开发人员平台提供了基础但是在重要的地方保留了用户选择权能有更高的灵活性。 Kubernetes 不限制支持的应用程序类型。 Kubernetes 旨在支持极其多种多样的工作负载包括无状态、有状态和数据处理工作负载。 如果应用程序可以在容器中运行那么它应该可以在 Kubernetes 上很好地运行。不部署源代码也不构建你的应用程序。 持续集成CI、交付和部署CI/CD工作流取决于组织的文化和偏好以及技术要求。不提供应用程序级别的服务作为内置服务例如中间件例如消息中间件、 数据处理框架例如 Spark、数据库例如 MySQL、缓存、集群存储系统 例如 Ceph。这样的组件可以在 Kubernetes 上运行并且/或者可以由运行在 Kubernetes 上的应用程序通过可移植机制例如开放服务代理来访问。不是日志记录、监视或警报的解决方案。 它集成了一些功能作为概念证明并提供了收集和导出指标的机制。不提供也不要求配置用的语言、系统例如 jsonnet它提供了声明性 API 该声明性 API 可以由任意形式的声明性规范所构成。不提供也不采用任何全面的机器配置、维护、管理或自我修复系统。此外Kubernetes 不仅仅是一个编排系统实际上它消除了编排的需要。 编排的技术定义是执行已定义的工作流程首先执行 A然后执行 B再执行 C。 而 Kubernetes 包含了一组独立可组合的控制过程可以持续地将当前状态驱动到所提供的预期状态。 你不需要在乎如何从 A 移动到 C也不需要集中控制这使得系统更易于使用且功能更强大、 系统更健壮更为弹性和可扩展。 1.2、架构 整体主从方式 Master 节点架构 kube-apiserver 对外暴露 K8S 的 api 接口是外界进行资源操作的唯一入口提供认证、授权、访问控制、API 注册和发现等机制 etcd etcd 是兼具一致性和高可用性的键值数据库可以作为保存 Kubernetes 所有集群数据的后台数据库。Kubernetes 集群的 etcd 数据库通常需要有个备份计划 kube-scheduler 主节点上的组件该组件监视那些新创建的未指定运行节点的 Pod并选择节点让 Pod 在上面运行。所有对 k8s 的集群操作都必须经过主节点进行调度 kube-controller-manager 在主节点上运行控制器的组件这些控制器包括: 节点控制器Node Controller: 负责在节点出现故障时进行通知和响应。副本控制器Replication Controller: 负责为系统中的每个副本控制器对象维护正确数量的 Pod。端点控制器Endpoints Controller: 填充端点(Endpoints)对象(即加入 Service与 Pod)。服务帐户和令牌控制器Service Account Token Controllers: 为新的命名空间创建默认帐户和 API 访问令牌 ​ ​3. Node 节点架构 kubelet 一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。负责维护容器的生命周期同时也负责 VolumeCSI和网络CNI的管理 kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡 容器运行环境(Container Runtime) 容器运行环境是负责运行容器的软件。Kubernetes 支持多个容器运行环境: Docker、 containerd、cri-o、 rktlet 以及任何实现 Kubernetes CRI (容器运行环境接口)。 fluentd 是一个守护进程它有助于提供集群层面日志 集群层面的日志 1.3、概念 Container容器可以是 docker 启动的一个容器 Pod k8s 使用 Pod 来组织一组容器一个 Pod 中的所有容器共享同一网络。Pod 是 k8s 中的最小部署单元 Volume 声明在 Pod 容器中可访问的文件目录可以被挂载在 Pod 中一个或多个容器指定路径下支持多种后端存储抽象(本地存储分布式存储云存储…) Controllers更高层次对象部署和管理 Pod ReplicaSet确保预期的 Pod 副本数量Deplotment无状态应用部署StatefulSet有状态应用部署DaemonSet确保所有 Node 都运行一个指定 PodJob一次性任务Cronjob定时任务 Deployment 定义一组 Pod 的副本数目、版本等通过控制器Controller维持 Pod 数目(自动回复失败的 Pod)通过控制器以指定的策略控制版本滚动升级回滚等 Service 定义一组 Pod 的访问策略Pod 的负载均衡提供一个或者多个 Pod 的稳定访问地址支持多种方式ClusterIP、NodePort、LoadBalance Label标签用于对象资源的查询筛选 Namespace命名空间逻辑隔离 一个集群内部的逻辑隔离机制鉴权资源每个资源都属于一个 namespace同一个 namespace 所有资源名不能重复不同 namespace 可以资源名重复 API 我们通过 kubernetes 的 API 来操作整个集群。 可以通过 kubectl、ui、curl 最终发送 httpjson/yaml 方式的请求给 API Server然后控制 k8s集群。k8s 里的所有的资源对象都可以采用 yaml 或 JSON 格式的文件定义或描述 1.4、快速体验 1、安装 minikube https://github.com/kubernetes/minikube/releases 下载 minikube-windows-amd64.exe 改名为 minikube.exe 打开 VirtualBox打开 cmd 运行 minikube start --vm-drivervirtualbox --registry-mirrorhttps://registry.docker-cn.com 等待 20 分钟左右即可 2、体验 nginx 部署升级 1.5、流程叙述 通过 Kubectl 提交一个创建 RCReplication Controller的请求该请求通过 APIServer被写入 etcd 中此时 Controller Manager 通过 API Server 的监听资源变化的接口监听到此 RC 事件分析之后发现当前集群中还没有它所对应的 Pod 实例于是根据 RC 里的 Pod 模板定义生成一个 Pod 对象通过 APIServer 写入 etcd此事件被 Scheduler 发现它立即执行一个复杂的调度流程为这个新 Pod 选定一个落户的 Node然后通过 API Server 讲这一结果写入到 etcd 中目标 Node 上运行的 Kubelet 进程通过 APIServer 监测到这个“新生的”Pod并按照它的定义启动该 Pod 并任劳任怨地负责它的下半生直到 Pod 的生命结束。随后我们通过 Kubectl 提交一个新的映射到该 Pod 的 Service 的创建请求ControllerManager 通过 Label 标签查询到关联的 Pod 实例然后生成 Service 的Endpoints 信息并通过 APIServer 写入到 etcd 中接下来所有 Node 上运行的 Proxy 进程通过 APIServer 查询并监听 Service 对象与其对应的 Endpoints 信息建立一个软件方式的负载均衡器来实现 Service 访问到后端Pod 的流量转发功能。 k8s 里的所有的资源对象都可以采用 yaml 或 JSON 格式的文件定义或描述 2、k8s 集群安装 2.1、kubeadm kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具。 这个工具能通过两条指令完成一个 kubernetes 集群的部署 创建一个 Master 节点 $ kubeadm init 将一个 Node 节点加入到当前集群中 $ kubeadm join Master 节点的 IP 和端口 2.2、前置要求 一台或多台机器操作系统 CentOS7.x-86_x64 硬件配置2GB 或更多 RAM2 个 CPU 或更多 CPU硬盘 30GB 或更多 集群中所有机器之间网络互通 可以访问外网需要拉取镜像 禁止 swap 分区 2.3、部署步骤 在所有节点上安装 Docker 和 kubeadm部署 Kubernetes Master部署容器网络插件部署 Kubernetes Node将节点加入 Kubernetes 集群中部署 Dashboard Web 页面可视化查看 Kubernetes 资源 2.4、环境准备 1、准备工作 我们可以使用 VMware 快速创建三个虚拟机。虚拟机启动前先设置 VMware 的主机网络。现全部统一为 192.168.119.1以后所有虚拟机都是 119.x 的 ip 地址 设置虚拟机存储目录防止硬盘空间不足 2、启动三个虚拟机 使用我们提供的 vagrant 文件复制到非中文无空格目录下运行 vagrant up 启动三个 虚拟机。其实 vagrant 完全可以一键部署全部 k8s 集群。 https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster http://github.com/davidkbainbridge/k8s-playground 进入三个虚拟机开启 root 的密码访问权限。 所有虚拟机设置为 node1分配 4g、4Cgnode2、node3 分配 16g16C 设置好 NAT 网络 3、设置 linux 环境(三个节点都执行) 关闭防火墙 systemctl stop firewalld systemctl disable firewalld关闭 selinux sed -i s/enforcing/disabled/ /etc/selinux/config setenforce 0关闭 swap swapoff -a #临时 sed -ri s/.*swap.*/#/ /etc/fstab #永久 free -g #验证swap 必须为 0添加主机名与 IP 对应关系 vi /etc/hosts 192.168.119.133 k8s-node1 192.168.119.134 k8s-node2 192.168.119.135 k8s-node3hostnamectl set-hostname newhostname指定新的 hostname su 切换过来wq保存然后重启每台服务 将桥接的 IPv4 流量传递到 iptables 的链 cat /etc/sysctl.d/k8s.conf EOF net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 EOF# 加载参数 sysctl --system2.5、所有节点安装 Docker、kubeadm、kubelet、kubectl Kubernetes 默认 CRI容器运行时为 Docker因此先安装 Docker。 1、安装 docker 卸载系统之前的 docker # 安装前先更新yum,不然有可能出现本机无法连接虚拟机的mysql、redis等 sudo yum update # 卸载系统之前的docker以及 docker-cli sudo yum remove docker-ce docker-ce-cli containerd.io # 卸载系统之前的docker sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine安装 Docker-CE (1)、安装必须的依赖 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2(2)、设置 docker repo 的 yum 位置 # 配置镜像 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(3)、安装 docker以及 docker-cli 该命令安装docker以后kubeadm初始化时会报错提示版本不兼容 sudo yum install -y docker-ce docker-ce-cli containerd.io所以我们使用推荐docker版本 sudo yum install docker-ce-3:19.03.15-3.el7.x86_64 docker-ce-cli-19.03.15-3.el7.x86_64 containerd.io配置 docker 加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF {registry-mirrors: [https://chqac97z.mirror.aliyuncs.com] } EOF sudo systemctl daemon-reload sudo systemctl restart docker启动 docker 设置 docker 开机自启 systemctl enable docker基础环境准备好可以给三个虚拟机备份一下为 node1分配 4g、4Cgnode2、node3 分配 16g16C。方便未来侧测试 2、添加阿里云 yum 源 cat /etc/yum.repos.d/kubernetes.repo EOF [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled1 gpgcheck0 repo_gpgcheck0 gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF3、安装 kubeadmkubelet 和 kubectl yum list|grep kubeyum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3systemctl enable kubelet systemctl start kubelet2.6、部署 k8s-mastermaster节点 下载镜像 由于需要下载好多镜像我们也不知道下载进入如何此时我们通过运行提供的脚本来下载镜像可以看到下载进度 (1)、上传k8s文件到主节点 解压发现没有该命令unzip安装unzip命令 sudo yum update sudo yum install unzip(2)、可以看到master_images.sh脚本内容 我们只需要启动该脚本就可以了 (3)、我们看到master_images.sh脚本没有执行权限我们这个时候还不能启动脚本下载镜像修改权限 chmod 700 master_images.sh(4)、启动脚本 ./master_images.shmaster 节点初始化 kubeadm init \ --apiserver-advertise-address192.168.119.133 \ --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ --kubernetes-version v1.17.3 \ --service-cidr10.96.0.0/16 \ --pod-network-cidr10.244.0.0/16由于默认拉取镜像地址 k8s.gcr.io 国内无法访问这里指定阿里云镜像仓库地址。可以手动 按照我们的 images.sh 先拉取镜像地址变为 registry.aliyuncs.com/google_containers 也可以。 科普无类别域间路由Classless Inter-Domain Routing、CIDR是一个用于给用户分配 IP 地址以及在互联网上有效地路由 IP 数据包的对 IP 地址进行归类的方法。 拉取可能失败需要下载镜像。 运行完成提前复制加入集群的令牌 【注意】 初始化的时候报错 尝试推倒重来重置k8s集群 kubeadm reset 提示是否确认是。然后成功重置 重新安装成功 测试 kubectl(主节点执行) mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config获取所有节点 kubectl get nodes 目前 master 状态为 notready。等待网络加入完成即可。 查看 kubelet 日志 journalctl -u kubelet 先记录下来等网络加入完成才可以在从节点操作 kubeadm join 192.168.119.130:6443 --token qyc2xb.1ygxll0plko0te5n \ --discovery-token-ca-cert-hash sha256:6bfd3aeba6116f586b39f15428e6f358055fb14b819414785f7b4499da9255fbkubeadm join 192.168.119.133:6443 --token gqb4j5.c6f3n7hd2gaif5bv \--discovery-token-ca-cert-hash sha256:73746a1d5a5efbae299b1b96c363395f8e9dd08e69c7dd168abf41eff38aa0642.7、安装 Pod 网络插件CNImaster节点 初始化完成后对集群进行网络配置 kubectl apply -f k8s/kube-flannel.ymlkubectl apply -f \ https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml以上地址可能被墙大家获取上传我们下载好的 flannel.yml 运行即可同时 flannel.yml 中 指定的 images 访问不到可以去 docker hub 找一个 wget yml 的地址 vi 修改 yml 所有 amd64 的地址都修改了即可。 等待大约 3 分钟 kubectl get pods -n kube-system 查看指定名称空间的 pods kubectl get pods --all-namespaces 查看所有名称空间的 pods ip link set cni0 down 如果网络出现问题关闭 cni0重启虚拟机继续测试 执行 watch kubectl get pod -n kube-system -o wide 监控 pod 进度 等 3-10 分钟完全都是 running 以后继续 【注意】 问题一主节点 k8s应用flannel状态为Init:ImagePullBackOff 查看kube-flannel.yml文件时发现quay.io/coreos/flannel:v0.11.0-amd64 quay.io网站目前国内无法访问 解决方法 查看kube-flannel.yml需要什么image [rootk8s-node1 k8s]# grep image kube-flannel.ymlimage: quay.io/coreos/flannel:v0.11.0-amd64image: quay.io/coreos/flannel:v0.11.0-amd64image: quay.io/coreos/flannel:v0.11.0-arm64image: quay.io/coreos/flannel:v0.11.0-arm64image: quay.io/coreos/flannel:v0.11.0-armimage: quay.io/coreos/flannel:v0.11.0-armimage: quay.io/coreos/flannel:v0.11.0-ppc64leimage: quay.io/coreos/flannel:v0.11.0-ppc64leimage: quay.io/coreos/flannel:v0.11.0-s390ximage: quay.io/coreos/flannel:v0.11.0-s390x下载flannel:v0.11.0-amd64导入到docker中 可以去https://github.com/flannel-io/flannel/releases/tag/v0.11.0官方仓库下载镜像 mkdir /opt/cni-plugins[rootk8s-node1 cni-plugins]# docker load flanneld-v0.11.0-amd64.docker 7bff100f35cb: Loading layer [] 4.672MB/4.672MB 5d3f68f6da8f: Loading layer [] 9.526MB/9.526MB 9b48060f404d: Loading layer [] 5.912MB/5.912MB 3f3a4ce2b719: Loading layer [] 35.25MB/35.25MB 9ce0bb155166: Loading layer [] 5.12kB/5.12kB Loaded image: quay.io/coreos/flannel:v0.11.0-amd64 [rootk8s-node1 cni-plugins]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy v1.17.3 ae853e93800d 4 years ago 116MB registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver v1.17.3 90d27391b780 4 years ago 171MB registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager v1.17.3 b0f1517c1f4b 4 years ago 161MB registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler v1.17.3 d109c0821a2b 4 years ago 94.4MB registry.cn-hangzhou.aliyuncs.com/google_containers/coredns 1.6.5 70f311871ae1 4 years ago 41.6MB registry.cn-hangzhou.aliyuncs.com/google_containers/etcd 3.4.3-0 303ce5db0e90 4 years ago 288MB quay.io/coreos/flannel v0.11.0-amd64 ff281650a721 5 years ago 52.6MB registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.1 da86e6ba6ca1 6 years ago 742kB修改本地Linux上的kube-flannel.yml文件 最后刷新pod kubectl apply -f kube-flannel.yml结果 问题二所有节点 执行完毕后问题表现为coredns无法启动master与node1处于NotReady状态如图所示 原因排查 对有问题的pod进行describe 报错显示2个节点都有污点因此无法调度于是对k8s-node1进行排查 kubectl describe po coredns-7f9c544f75-cx56n -n kube-system|less对node1进行describe kubectl describe nodes k8s-node1|less发现错误如下 KubeletNotReady runtime network not ready: NetworkReadyfalse reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized由此推断是Kubelet没有部署好并且是网络插件导致的因此对Kubelet进行打印 journalctl -u kubelet --since today | less6月 16 22:18:26 k8s-node1 kubelet[49627]: : [failed to find plugin flannel in path [/opt/cni/bin]] 6月 16 22:18:26 k8s-node1 kubelet[49627]: W0616 22:18:26.884471 49627 cni.go:237] Unable to update cni config: no valid networks found in /etc/cni/net.d 6月 16 22:18:28 k8s-node1 kubelet[49627]: E0616 22:18:28.582488 49627 pod_workers.go:191] Error syncing pod 815f19d1-da0d-467f-a16b-79193ccbae39 (kube-flannel-ds-lqhbw_kube-flannel(815f19d1-da0d-467f-a16b -79193ccbae39)), skipping: failed to StartContainer for install-cni-plugin with ImagePullBackOff: Back-off pulling image \docker.io/flannel/flannel-cni-plugin:v1.4.1-flannel1\ 6月 16 22:18:31 k8s-node1 kubelet[49627]: W0616 22:18:31.887401 49627 cni.go:202] Error validating CNI config list { 6月 16 22:18:31 k8s-node1 kubelet[49627]: name: cbr0, 6月 16 22:18:31 k8s-node1 kubelet[49627]: cniVersion: 0.3.1, 6月 16 22:18:31 k8s-node1 kubelet[49627]: plugins: [ 6月 16 22:18:31 k8s-node1 kubelet[49627]: { 6月 16 22:18:31 k8s-node1 kubelet[49627]: type: flannel, 6月 16 22:18:31 k8s-node1 kubelet[49627]: delegate: { 6月 16 22:18:31 k8s-node1 kubelet[49627]: hairpinMode: true, 6月 16 22:18:31 k8s-node1 kubelet[49627]: isDefaultGateway: true 6月 16 22:18:31 k8s-node1 kubelet[49627]: } 6月 16 22:18:31 k8s-node1 kubelet[49627]: }, 6月 16 22:18:31 k8s-node1 kubelet[49627]: { 6月 16 22:18:31 k8s-node1 kubelet[49627]: type: portmap, 6月 16 22:18:31 k8s-node1 kubelet[49627]: capabilities: { 6月 16 22:18:31 k8s-node1 kubelet[49627]: portMappings: true 6月 16 22:18:31 k8s-node1 kubelet[49627]: } 6月 16 22:18:31 k8s-node1 kubelet[49627]: } 6月 16 22:18:31 k8s-node1 kubelet[49627]: ] 6月 16 22:18:31 k8s-node1 kubelet[49627]: }最终定位问题至flannel问题 报错failed to find plugin “flannel” in path /opt/cni/bin 又在网上差了一些资料得到解决方案 解决方法 Github 手动下载 cni plugin v0.8.6 地址如下https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz 解压后将flannel文件拷贝至 /opt/cni/bin/目录下 mkdir /opt/cni-plugins tar -zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni-plugins/ cp flannel /opt/cni/bin/容器瞬间启动master节点处于Ready状态。同理k8s-node2,k8s-node3进行同样操作。问题解决。 2.8、加入 Kubernetes Node从节点 在 Node 节点执行。 向集群添加新节点执行在 kubeadm init 输出的 kubeadm join 命令 确保 node 节点成功 token 过期怎么办 kubeadm token create --print-join-commandkubeadm token create --ttl 0 --print-join-commandkubeadm join 192.168.119.130:6443 --token oqnc6s.wiqeib0osvp37yxg --discovery-token-ca-cert-hash sha256:b3e6f39c9b70eece87cc9d29c32b42b4d0d2db930383e2e799208c07b489979d执行 watch kubectl get pod -n kube-system -o wide 监控 pod 进度 等 3-10 分钟完全都是 running 以后使用 kubectl get nodes 检查状态 执行命令报错 [rootk8s-node1 k8s]# kubeadm join 192.168.119.130:6443 --token enj3vg.fikkr30njmptrtem \--discovery-token-ca-cert-hash sha256:b7b3baf3082e0d9acd3a0a4f2352224ecb007da583bcc02861f36956c9f017c1 W0605 11:06:13.897366 36607 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set. [preflight] Running pre-flight checks[WARNING IsDockerSystemdCheck]: detected cgroupfs as the Docker cgroup driver. The recommended driver is systemd. Please follow the guide at https://kubernetes.io/docs/setup/cri/ error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR DirAvailable--etc-kubernetes-manifests]: /etc/kubernetes/manifests is not empty[ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists[ERROR Port-10250]: Port 10250 is in use[ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists [preflight] If you know what you are doing, you can make a check non-fatal with --ignore-preflight-errors... To see the stack trace of this error execute with --v5 or higher问题一 [WARNING IsDockerSystemdCheck]: detected cgroupfs as the Docker cgroup driver. The recommended driver is systemd. Please follow the guide at https://kubernetes.io/docs/setup/cri/报错原因 在kubeadm join 添加工作节点时出现docker 驱动cgroup的问题。检测到cgroupfs作为Docker的cgroup驱动程序推荐使用systemd驱动。 解决办法 修改前先查看驱动信息 docker info | grep Cgrou 修改/etc/docker/daemon.json文件 vi /etc/docker/daemon.json #添加以下信息 {exec-opts:[native.cgroupdriversystemd] }重启docker systemctl restart docker确认下修改后的驱动信息 问题二 [ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists [ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists报错原因 有残留文件 解决办法 #删除k8s配置文件和证书文件 rm -rf /etc/kubernetes/kubelet.conf /etc/kubernetes/pki/ca.crt问题三 端口占用提示[ERROR Port-10250]: Port 10250 is in use sudo yum install -y net-tools -q #安装相关工具-q静默安装)然后查看端口 可以看出是K8S占用了那就尝试重启服务看看能不能解决 2.9、入门操作 kubernetes 集群 1、部署一个 tomcat kubectl create deployment tomcat6 --imagetomcat:6.0.53-jre8 kubectl get pods -o wide #可以获取到 tomcat 信息2、暴露 tomcat 访问 kubectl expose deployment tomcat6 --port80 --target-port8080 --typeNodePort现在我们使用NodePort的方式暴露这样访问每个节点的端口都可以访问各个Pod如果节点宕机就会出现问题。 Pod 的 80 映射容器的 8080service 会代理 Pod 的 80 kubectl get svc3、动态扩容测试 kubectl get deployment应用升级 kubectl set image (–help 查看帮助) 扩容 kubectl scale --replicas3 deployment tomcat6扩容了多份所有无论访问哪个 node 的指定端口都可以访问到 tomcat6 4、以上操作的 yaml 获取 参照 k8s 细节 5、删除 kubectl get all kubectl delete deployment.apps/tomcat6 kubectl delete service/tomcat6流程创建 deployment 会管理 replicasreplicas 控制 pod 数量有 pod 故障会自动拉起新的 pod 2.10、安装默认 dashboard 1、部署 dashboard kubectl apply -f \ https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommende d/kubernetes-dashboard.yaml墙的原因文件已经放在我们的 code 目录自行上传 文件中无法访问的镜像自行去 docker hub 找 2、暴露 dashboard 为公共访问 默认 Dashboard 只能集群内部访问修改 Service 为 NodePort 类型暴露到外部 kind: Service apiVersion: v1 metadata: labels:k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system spec: type: NodePort ports:- port: 443targetPort: 8443nodePort: 30001 selector:k8s-app: kubernetes-dashboard访问地址http://NodeIP:30001 3、创建授权账户 kubectl create serviceaccount dashboard-admin -n kube-system kubectl create clusterrolebinding dashboard-admin --clusterrolecluster-admin --serviceaccountkube-system:dashboard-admin kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk /dashboard-admin/{print $1})使用输出的 token 登录 Dashboard。 二、K8S 细节 1、kubectl kubectl 文档 https://kubernetes.io/zh/docs/reference/kubectl/overview/ 资源类型 https://kubernetes.io/zh-cn/docs/reference/kubectl/#%E8%B5%84%E6%BA%90%E7%B1%BB%E5%9E%8B 格式化输出 https://kubernetes.io/zh-cn/docs/reference/kubectl/#%E6%A0%BC%E5%BC%8F%E5%8C%96%E8%BE%93%E5%87%BA 常用操作 https://kubernetes.io/zh-cn/docs/reference/kubectl/#%E7%A4%BA%E4%BE%8B-%E5%B8%B8%E7%94%A8%E6%93%8D%E4%BD%9C 命令参考 https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands 2、yaml 语法 yml 模板 yaml 字段解析 参照官方文档 https://kubernetes.io/zh-cn/docs/reference/kubectl/#%E8%B5%84%E6%BA%90%E7%B1%BB%E5%9E%8B yaml输出 在此示例中以下命令将单个 pod 的详细信息输出为 YAML 格式的对象 kubectl get pod web-pod-13je7 -o yaml–dry-run –dry-run‘none’: Must be “none”, “server”, or “client”. If client strategy, only print the object that would be sent, without sending it. If server strategy, submit server-side request without persisting the resource. 值必须为或。 noneserver提交服务器端请求而不持久化资源。client只打印该发送对象但不发送它。 也就是说通过–dry-run选项并不会真正的执行这条命令。 输出yaml案例 kubectl create deployment tomcat6 --imagetomcat:6.0.53-jre8 --dry-run -o yaml tomact6-deployment.yaml查看yamlcat tomact6-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:creationTimestamp: nulllabels:app: tomcat6name: tomcat6 spec:replicas: 1selector:matchLabels:app: tomcat6strategy: {}template:metadata:creationTimestamp: nulllabels:app: tomcat6spec:containers:- image: tomcat:6.0.53-jre8name: tomcatresources: {} status: {}3、入门操作 Pod 是什么Controller 是什么 https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/#pods-and-controllers Pod和控制器 控制器可以为您创建和管理多个 Pod管理副本和上线并在集群范围内提供自修复能力。 例如如果一个节点失败控制器可以在不同的节点上调度一样的替身来自动替换 Pod。 包含一个或多个 Pod 的控制器一些示例包括 Deployment StatefulSet DaemonSet 控制器通常使用您提供的 Pod 模板来创建它所负责的 Pod DeploymentService 是什么 Service 的意义 部署一个 nginx kubectl create deployment nginx --imagenginx暴露 nginx 访问 kubectl expose deployment nginx --port80 --typeNodePort 统一应用访问入口 Service 管理一组 Pod。 防止 Pod 失联服务发现、定义一组 Pod 的访问策略 现在 Service 我们使用 NodePort 的方式暴露这样访问每个节点的端口都可以访问到这个 Pod如果节点宕机就会出现问题。 labels and selectors Ingress 通过 Service 发现 Pod 进行关联。基于域名访问。 通过 Ingress Controller 实现 Pod 负载均衡 支持 TCP/UDP 4 层负载均衡和 HTTP 7 层负载均衡 步骤 1、部署 Ingress Controller 2、创建 Ingress 规则 apiVersion: extensions/v1beta1 kind: Ingress metadata:name: web spec:rules:- host: tomcat6.atguigu.comhttp:paths:- backend:serviceName: tomcat6servicePort: 80如果再部署了 tomcat8看效果 kubectl create deployment tomcat8 --imagetomcat:8.5.51-jdk8 kubectl expose deployment tomcat8 --port88 --target-port8080 --typeNodePort kubectl delete xxx #删除指定资源随便配置域名对应哪个节点都可以访问 tomcat6/8因为所有节点的 ingress-controller 路由表是同步的。 网络模型 Kubernetes 的网络模型从内至外由四个部分组成 Pod 内部容器所在的网络Pod 所在的网络Pod 和 Service 之间通信的网络外界与 Service 之间通信的网络 4、项目部署 项目部署流程 制作项目镜像将项目制作为 Docker 镜像要熟悉 Dockerfile 的编写控制器管理 Pod编写 k8s 的 yaml 即可暴露应用日志监控 接下来我们还是以原先部署tomact6为实例 创建yaml kubectl create deployment tomcat6 --imagetomcat:6.0.53-jre8 --dry-run -o yaml tomact6-deployment.yaml修改yaml vi tomact6-deployment.yamlapiVersion: apps/v1 kind: Deployment metadata:labels:app: tomcat6name: tomcat6 spec:replicas: 3selector:matchLabels:app: tomcat6template:metadata:labels:app: tomcat6spec:containers:- image: tomcat:6.0.53-jre8name: tomcat应用 tomact6-deployment.yaml 部署tomact6 kubectl apply -f tomact6-deployment.yaml查看某个pod的具体信息 [rootk8s-node1 k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE tomcat6-5f7ccf4cb9-qrnvh 1/1 Running 0 11h tomcat6-5f7ccf4cb9-sb6jg 1/1 Running 0 11h tomcat6-5f7ccf4cb9-xsxsx 1/1 Running 0 11h [rootk8s-node1 k8s]# kubectl get pods tomcat6-5f7ccf4cb9-qrnvh -o yaml暴露 tomcat6 访问 前面我们通过命令行的方式部署和暴露了tomcat实际上也可以通过yaml的方式来完成这些操作。暴露端口也通过yaml生成yaml并部署 kubectl expose deployment tomcat6 --port80 --target-port8080 --typeNodePort --dry-run -o yaml整合 tomact6-deployment.yaml - 关联部署和service 将这段输出和“tomcat6-deployment.yaml”用—进行拼接表示部署完毕并进行暴露服务 vi tomact6-deployment.yamlapiVersion: apps/v1 kind: Deployment #部署 metadata:labels:app: tomcat6 #标签name: tomcat6 spec:replicas: 3 #副本数selector:matchLabels:app: tomcat6template:metadata:labels:app: tomcat6spec:containers:- image: tomcat:6.0.53-jre8name: tomcat --- apiVersion: v1 kind: Service metadata:labels:app: tomcat6 #标签name: tomcat6 spec:ports:- port: 80protocol: TCPtargetPort: 8080selector:app: tomcat6 #标签type: NodePort上面类型一个是Deployment一个是Service 删除以前的部署 kubectl get all kubectl delete deployment.apps/tomcat6部署并暴露服务 kubectl apply -f tomact6-deployment.yaml查看服务和部署信息 测试 访问k8s-node1k8s-node1和k8s-node3的30952端口随便访问一个地址http://192.168.119.132:30952/ 现在的问题是service的3个pod都可以访问但怎么创建个总的管理者以便负载均衡 部署Ingeress 通过Ingress发现pod进行关联。基于域名访问 通过Ingress controller实现POD负载均衡 支持TCP/UDP 4层负载均衡和HTTP 7层负载均衡 可以把ingress理解为nginx通过域名访问service端口 Ingress管理多个serviceservice管理多个pod 步骤 1)、部署Ingress controller 主节点执行“k8s/ingress-controller.yaml” cd k8s kubectl apply -f ingress-controller.yaml查看 这里master节点负责调度具体执行交给node2和node3来完成 2)、创建Ingress规则 vi ingress-tomact6.yamlapiVersion: extensions/v1beta1 kind: Ingress metadata:name: web spec:rules:- host: tomcat6.atguigu.comhttp:paths:- backend:serviceName: tomcat6servicePort: 80执行 kubectl apply -f ingress-tomact6.yaml修改本机的hosts文件添加如下的域名转换规则 修改“C:\Windows\System32\drivers\etc\hosts” 192.168.119.130 tomact6.atguigu.com 192.168.119.131 tomact6.atguigu.com 192.168.119.132 tomact6.atguigu.com访问http://tomact6.atguigu.com:30952/ 并且集群中即便有一个节点不可用也不影响整体的运行。 三、KubeSphere 默认的 dashboard 没啥用我们用 kubesphere 可以打通全部的 devops 链路。 Kubesphere 集成了很多套件集群要求较高 https://kubesphere.io/ Kuboard 也很不错集群要求不高 https://kuboard.cn/support/ 1、简介 KubeSphere 是一款面向云原生设计的开源项目在目前主流容器调度平台 Kubernetes 之上构建的分布式多租户容器管理平台提供简单易用的操作界面以及向导式操作方式在降低用户使用容器调度平台学习成本的同时极大降低开发、测试、运维的日常工作的复杂度。 2、安装 2.1、前提条件 https://v2-1.docs.kubesphere.io/docs/zh-CN/installation/prerequisites/ 2.2、安装前提环境 2.2.1、安装 helmmaster 节点执行 Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的 apt、Centos中使用的 yum 或者 Python 中的 pip 一样能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成, 能够将一组 K8S 资源打包统一管理, 是查找、共享和使用为 Kubernetes 构建的软件的最佳方式。 1)、安装 curl -L https://git.io/get_helm.sh | bash墙原因上传我们给定的 get_helm.shchmod 700 然后./get_helm.sh 可能有文件格式兼容性问题用 vi 打开该 sh 文件输入 :set ff 回车显示 fileformatdos重新设置下文件格式 :set ffunix 保存退出: :wq # github打不开可以去gitee搜搜一般软件都有人克隆过 # 可以去这里下载压缩包 https://github.com/helm/helm/releases/tag/v2.16.13 # helm-v2.16.3-linux-amd64.tar.gz tar xf helm-v2.16.3-linux-amd64.tar.gz cp linux-amd64/helm /usr/local/bin cp linux-amd64/tiller /usr/local/bin helm version # Client: version.Version{SemVer:v2.16.3} # Error: could not find tiller2)、验证版本 helm version3)、创建权限master 执行 创建 helm-rbac.yaml写入如下内容 vi helm-rbac.yamlapiVersion: v1 kind: ServiceAccount metadata:name: tillernamespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: tiller roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin subjects:- kind: ServiceAccountname: tillernamespace: kube-system应用配置 kubectl apply -f helm-rbac.yaml2.2.2、安装 Tillermaster 执行 1)、初始化 helm init --service-accounttiller --tiller-imagejessestuart/tiller:v2.16.3 --history-max 300–tiller-image 指定镜像否则会被墙。大家使用这个镜像比较好 jessestuart/tiller:v2.16.3 等待节点上部署的 tiller 完成即可 kubectl get pod --all-namespaces【注意】 如果初始化执行指定镜像还是报错。更改仓库地址尝试将稳定仓库的 URL 更改为其他可用的地址。您可以尝试使用 Helm 官方维护的仓库地址进行初始化。 报错内容 Creating /root/.helm/repository/repositories.yaml Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com Error: error initializing: Looks like https://kubernetes-charts.storage.googleapis.com is not a valid chart repository or cannot be reached: Failed to fetch https://kubernetes-charts.storage.googleapis.com/index.yaml : 403 Forbidden更改仓库地址命令 helm init --service-accounttiller --tiller-imagejessestuart/tiller:v2.16.3 --history-max 300 --stable-repo-url https://charts.helm.sh/stable2)、测试 helm install stable/nginx-ingress --name nginx-ingress helm ls helm delete nginx-ingress3)、使用语法 创建一个 chart 范例 helm create helm-chart检查 chart 语法 helm lint ./helm-chart使用默认 chart 部署到 k8s helm install --name example1 ./helm-chart --set service.typeNodePort查看是否部署成功 kubectl get pod2.2.3、安装 OpenEBSmaster 执行 https://v2-1.docs.kubesphere.io/docs/zh-CN/appendix/install-openebs/ 前提条件 已有 Kubernetes 集群并安装了 kubectl 或 HelmPod 可以被调度到集群的 master 节点可临时取消 master 节点的 Taint 关于第二个前提条件是由于安装 OpenEBS 时它有一个初始化的 Pod 需要在 k8s-node1 节点启动并创建 PV 给 KubeSphere 的有状态应用挂载。因此若您的 k8s-node1 节点存在 Taint建议在安装 OpenEBS 之前手动取消 Taint待 OpenEBS 与 KubeSphere 安装完成后再对 k8s-node1 打上 Taint以下步骤供参考 例如本示例有一个 k8s-node1 节点节点名称即 k8s-node1可通过以下命令查看节点名称 [rootk8s-node1 k8s]# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s-node1 Ready master 2d v1.17.3 192.168.119.130 none CentOS Linux 7 (Core) 3.10.0-1160.119.1.el7.x86_64 docker://19.3.15 k8s-node2 Ready none 47h v1.17.3 192.168.119.131 none CentOS Linux 7 (Core) 3.10.0-1160.119.1.el7.x86_64 docker://19.3.15 k8s-node3 Ready none 47h v1.17.3 192.168.119.132 none CentOS Linux 7 (Core) 3.10.0-1160.119.1.el7.x86_64 docker://19.3.15确定 master 节点是否有 taint kubectl describe node k8s-node1 | grep Taint去掉 master 节点的 Taint kubectl taint nodes k8s-node1 node-role.kubernetes.io/master:NoSchedule-安装 OpenEBS 创建 OpenEBS 的 namespaceOpenEBS 相关资源将创建在这个 namespace 下 kubectl create ns openebs查看所有的名称空间 kubectl get ns安装 OpenEBS以下列出两种方法可参考其中任意一种进行创建 A. 若集群已安装了 Helm可通过 Helm 命令来安装 OpenEBS helm install --namespace openebs --name openebs stable/openebs --version 1.5.0B. 除此之外 还可以通过 kubectl 命令安装 kubectl apply -f https://openebs.github.io/charts/openebs-operator-1.5.0.yaml安装 OpenEBS 后将自动创建 4 个 StorageClass查看创建的 StorageClass kubectl get sc如下将 openebs-hostpath设置为 默认的 StorageClass kubectl patch storageclass openebs-hostpath -p {metadata: {annotations:{storageclass.kubernetes.io/is-default-class:true}}}至此OpenEBS 的 LocalPV 已作为默认的存储类型创建成功。可以通过命令 kubectl get pod -n openebs来查看 OpenEBS 相关 Pod 的状态若 Pod 的状态都是 running则说明存储安装成功。 kubectl get pod -n openebs由于在文档开头手动去掉了 k8s-node1 节点的 Taint我们可以在安装完 OpenEBS 后将 k8s-node1 节点 Taint 加上避免业务相关的工作负载调度到 k8s-node1 节点抢占 k8s-node1 资源。 kubectl taint nodes k8s-node1 node-role.kubernetes.iomaster:NoSchedule注意此时不要给master加上污点否者导致后面的pods安装不上(openldap,redis),待kubesphere安装完成后加上污点 2.3、最小化安装 KubeSphere 若集群可用 CPU 1 Core 且可用内存 2 G可以使用以下命令最小化安装 KubeSphere kubectl apply -f https://raw.githubusercontent.com/kubesphere/ks-installer/v2.1.1/kubesphere-minimal.yaml提示若您的服务器提示无法访问 GitHub可将 kubesphere-minimal.yaml 或 kubesphere-complete-setup.yaml文件保存到本地作为本地的静态文件再参考上述命令进行安装。 vi kubesphere-mini.yaml--- apiVersion: v1 kind: Namespace metadata:name: kubesphere-system--- apiVersion: v1 data:ks-config.yaml: |---persistence:storageClass: etcd:monitoring: FalseendpointIps: 192.168.0.7,192.168.0.8,192.168.0.9port: 2379tlsEnable: Truecommon:mysqlVolumeSize: 20GiminioVolumeSize: 20GietcdVolumeSize: 20GiopenldapVolumeSize: 2GiredisVolumSize: 2Gimetrics_server:enabled: Falseconsole:enableMultiLogin: False # enable/disable multi loginport: 30880monitoring:prometheusReplicas: 1prometheusMemoryRequest: 400MiprometheusVolumeSize: 20Gigrafana:enabled: Falselogging:enabled: FalseelasticsearchMasterReplicas: 1elasticsearchDataReplicas: 1logsidecarReplicas: 2elasticsearchMasterVolumeSize: 4GielasticsearchDataVolumeSize: 20GilogMaxAge: 7elkPrefix: logstashcontainersLogMountedPath: kibana:enabled: Falseopenpitrix:enabled: Falsedevops:enabled: FalsejenkinsMemoryLim: 2GijenkinsMemoryReq: 1500MijenkinsVolumeSize: 8GijenkinsJavaOpts_Xms: 512mjenkinsJavaOpts_Xmx: 512mjenkinsJavaOpts_MaxRAM: 2gsonarqube:enabled: FalsepostgresqlVolumeSize: 8Giservicemesh:enabled: Falsenotification:enabled: Falsealerting:enabled: Falsekind: ConfigMap metadata:name: ks-installernamespace: kubesphere-system--- apiVersion: v1 kind: ServiceAccount metadata:name: ks-installernamespace: kubesphere-system--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:creationTimestamp: nullname: ks-installer rules: - apiGroups:- resources:- *verbs:- * - apiGroups:- appsresources:- *verbs:- * - apiGroups:- extensionsresources:- *verbs:- * - apiGroups:- batchresources:- *verbs:- * - apiGroups:- rbac.authorization.k8s.ioresources:- *verbs:- * - apiGroups:- apiregistration.k8s.ioresources:- *verbs:- * - apiGroups:- apiextensions.k8s.ioresources:- *verbs:- * - apiGroups:- tenant.kubesphere.ioresources:- *verbs:- * - apiGroups:- certificates.k8s.ioresources:- *verbs:- * - apiGroups:- devops.kubesphere.ioresources:- *verbs:- * - apiGroups:- monitoring.coreos.comresources:- *verbs:- * - apiGroups:- logging.kubesphere.ioresources:- *verbs:- * - apiGroups:- jaegertracing.ioresources:- *verbs:- * - apiGroups:- storage.k8s.ioresources:- *verbs:- * - apiGroups:- admissionregistration.k8s.ioresources:- *verbs:- *--- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata:name: ks-installer subjects: - kind: ServiceAccountname: ks-installernamespace: kubesphere-system roleRef:kind: ClusterRolename: ks-installerapiGroup: rbac.authorization.k8s.io--- apiVersion: apps/v1 kind: Deployment metadata:name: ks-installernamespace: kubesphere-systemlabels:app: ks-install spec:replicas: 1selector:matchLabels:app: ks-installtemplate:metadata:labels:app: ks-installspec:serviceAccountName: ks-installercontainers:- name: installerimage: kubesphere/ks-installer:v2.1.1imagePullPolicy: Always执行kubesphere-mini.yaml kubectl apply -f kubesphere-mini.yaml查看安装日志请耐心等待安装成功。 kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l appks-install -o jsonpath{.items[0].metadata.name}) -f打印结果 Start installing monitoring ************************************************** task monitoring status is successful total: 1 completed:1 ************************************************** ##################################################### ### Welcome to KubeSphere! ### #####################################################Console: http://192.168.119.130:30880 Account: admin Password: P88w0rdNOTES1. After logging into the console, please check themonitoring status of service components inthe Cluster Status. If the service is notready, please wait patiently. You can startto use when all components are ready.2. Please modify the default password after login.#####################################################当所有的pod都是running状态则说明安装完成才可以访问该地址 kubectl get pods --all-namespaces访问http://192.168.119.130:30880 Account: admin Password: P88w0rd 2.4、完整化安装 若集群可用 CPU 8 Core 且可用内存 16 G可以使用以下命令完整安装 KubeSphere。 注意应确保集群中有一个节点的可用内存大于 8 G。 kubectl apply -f https://raw.githubusercontent.com/kubesphere/ks-installer/v2.1.1/kubesphere-complete-setup.yaml查看滚动刷新的安装日志请耐心等待安装成功。 kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l appks-install -o jsonpath{.items[0].metadata.name}) -f说明安装过程中若遇到问题也可以通过以上日志命令来排查问题。 通过 kubectl get pod --all-namespaces查看 KubeSphere 相关 namespace 下所有 Pod 状态是否为 Running。确认 Pod 都正常运行后可使用 IP:30880访问 KubeSphere UI 界面默认的集群管理员账号为 admin/P88w0rd。 2.5、安装可插拔的功能组件 安装 Metrics-server 开启 HPA KubeSphere 支持对 Deployment 设置 弹性伸缩 (HPA)支持根据集群的监控指标如 CPU 使用率和内存使用量来设置弹性伸缩当业务需求增加时KubeSphere 能够无缝地自动水平增加 Pod 数量提高应用系统的稳定性。 关于如何使用 HPA 请参考 设置弹性伸缩注意Installer 默认最小化安装因此初始安装时并未开启 Metrics-server 的安装请在使用 HPA 之前开启 Metrics-server 的安装参考以下文档。 安装后如何开启 Metrics-server 安装 通过修改 ks-installer 的 configmap 可以选装组件执行以下命令。 kubectl edit cm -n kubesphere-system ks-installer参考如下修改 ConfigMap ··· devops:enabled: True #自动化部署打开jenkinsMemoryLim: 2GijenkinsMemoryReq: 1000Mi #jenkins初始化申请调整为1GjenkinsVolumeSize: 8GijenkinsJavaOpts_Xms: 512mjenkinsJavaOpts_Xmx: 512mjenkinsJavaOpts_MaxRAM: 2gsonarqube:enabled: True #代码质量检查打开postgresqlVolumeSize: 8Giservicemesh:enabled: Falsenotification:enabled: True #通知系统打开alerting:enabled: True #告警通知系统打开 保存退出参考 验证可插拔功能组件的安装 通过查询 ks-installer 日志或 Pod 状态验证功能组件是否安装成功。 查看安装日志 开启可插拔功能组件的安装后需要通过日志或 Pod 状态验证功能组件是否安装成功。 查看 ks-installer 安装过程中产生的动态日志等待安装成功 kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l appks-install -o jsonpath{.items[0].metadata.name}) -f当动态日志出现如下提示说明开启的组件已安装成功。 ##################################################### ### Welcome to KubeSphere! ### #####################################################Console: http://192.168.119.130:30880 Account: admin Password: P88w0rdNOTES1. After logging into the console, please check themonitoring status of service components inthe Cluster Status. If the service is notready, please wait patiently. You can startto use when all components are ready.2. Please modify the default password after login.##################################################### 安装成功后可登陆控制台在 服务组件下查看可插拔功能组件下的所有组件是否都已经安装启动完毕。 验证可插拔功能组件的运行结果 除了在控制台查看组件状态还可以通过 kubectl 命令确认可插拔的组件是否安装成功。 通常情况下当该 namespace 下的所有 Pod 状态都为 Running并且 Job 都为 Completed 状态则说明该组件安装成功。 kubectl get pods --all-namespaces3、多租户管理快速入门 3.1、目的 本文档面向初次使用 KubeSphere 的集群管理员用户引导新手用户创建企业空间、创建新的角色和账户然后邀请新用户进入企业空间后创建项目和 DevOps 工程帮助用户熟悉多租户下的用户和角色管理快速上手 KubeSphere。 3.2、前提条件 已安装 KubeSphere并使用默认的 admin 用户名和密码登录了 KubeSphere。 目前平台的资源一共有三个层级包括 集群 (Cluster)、 企业空间 (Workspace)、 项目 (Project) 和 DevOps Project (DevOps 工程)层级关系如下图所示即一个集群中可以创建多个企业空间而每个企业空间可以创建多个项目和 DevOps工程而集群、企业空间、项目和 DevOps工程中默认有多个不同的内置角色。 3.3、集群管理员 第一步创建角色和账号 平台中的 cluster-admin 角色可以为其他用户创建账号并分配平台角色平台内置了集群层级的以下三个常用的角色同时支持自定义新的角色。 内置角色描述cluster-admin集群管理员可以管理集群中所有的资源。workspaces-manager集群中企业空间管理员仅可创建、删除企业空间维护企业空间中的成员列表。cluster-regular集群中的普通用户在被邀请加入企业空间之前没有任何资源操作权限。 通过下图您可以更清楚地了解本示例的逻辑 本示例首先新建一个角色 (users-manager)为该角色授予账号管理和角色管理的权限然后新建一个账号并给这个账号授予 users-manager 角色。 账号名集群角色职责user-managerusers-manager管理集群的账户和角色 点击控制台左上角 平台管理 → 平台角色可以看到当前的角色列表点击 创建创建一个角色用于管理所有账户和角色。 填写角色的基本信息和权限设置。 名称起一个简洁明了的名称便于用户浏览和搜索如 users-manager 描述信息简单介绍该角色的职责如 管理账户和角色 权限设置中勾选账户管理和角色管理的所有权限点击 创建自定义的用户管理员的角色创建成功。 点击控制台左上角 平台管理 → 账户管理可以看到当前集群中所有用户的列表点击 创建 按钮。 填写新用户的基本信息如用户名设置为 atguigu-hr角色选择 user-manager其它信息可自定义点击 确定。 登录 说明上述步骤仅简单地说明创建流程关于账号管理与角色权限管理的详细说明请参考 角色权限概览 和 账号管理。 然后用 atgugu-hr 账户登录来创建下表中的四个账号ws-manager将用于创建一个企业空间并指定其中一个用户名为 ws-admin作为企业空间管理员。切换 atgugu-hr 账号登录后在 账号管理 下新建四个账号创建步骤同上参考如下信息创建。 用户名集群角色职责ws-managerworkspaces-manager创建和管理企业空间ws-admincluster-regular管理企业空间下所有的资源(本示例用于邀请新成员加入企业空间)project-admincluster-regular创建和管理项目、DevOps 工程邀请新成员加入project-regularcluster-regular将被 project-admin 邀请加入项目和 DevOps 工程用于创建项目和工程下的工作负载、Pipeline 等资源 ws-manager ws-admin project-admin project-regular 查看新建的四个账号信息。 3.4、企业空间管理员 第二步创建企业空间 企业空间 (workspace) 是 KubeSphere 实现多租户模式的基础是用户管理项目、DevOps 工程和企业成员的基本单位。 切换为 ws-manager登录 KubeSpherews-manager 有权限查看和管理平台的所有企业空间。 点击左上角的 平台管理→ 企业空间可见新安装的环境只有一个系统默认的企业空间 system-workspace用于运行 KubeSphere 平台相关组件和服务禁止删除该企业空间。 在企业空间列表点击 创建 参考如下提示填写企业空间的基本信息然后点击 确定。企业空间的创建者同时默认为该企业空间的管理员 (workspace-admin)拥有企业空间的最高管理权限。 企业空间名称请尽量保持企业名称简短便于用户浏览和搜索本示例是 gulimall-workspace企业空间管理员可从当前的集群成员中指定这里指定上一步创建的 ws-manager用户为管理员同时邀请了 ws-manager用户进入该企业空间描述信息简单介绍该企业空间 说明企业空间管理的详细说明请参考 企业空间管理。 企业空间 demo-workspace创建完成后切换为 ws-admin登录 KubeSphere点击左侧「进入企业空间」进入企业空间详情页。 ws-admin可以从集群成员中邀请新成员加入当前企业空间然后创建项目和 DevOps 工程。在左侧菜单栏选择 企业空间管理→ 成员管理点击 邀请成员。 这一步需要邀请在 步骤 1.6. 创建的两个用户 project-admin和 project-regular进入企业空间且分别授予 workspace-regular和 workspace-viewer的角色此时该企业空间一共有如下三个用户 用户名企业空间角色职责ws-adminworkspace-admin管理企业空间下所有的资源(本示例用于邀请新成员加入企业空间)project-adminworkspace-regular创建和管理项目、DevOps 工程邀请新成员加入project-regularworkspace-viewer将被 project-admin 邀请加入项目和 DevOps 工程用于创建工作负载、流水线等业务资源 3.5、项目和 DevOps 工程管理员 第三步创建项目 创建工作负载、服务和 CI/CD 流水线等资源之前需要预先创建项目和 DevOps 工程。 上一步将用户项目管理员 project-admin邀请进入企业空间后可切换为 project-admin账号登录KubeSphere默认进入 demo-workspace 企业空间下点击 创建选择 创建资源型项目。 填写项目的基本信息和高级设置完成后点击 下一步。 基本信息 名称为项目起一个简洁明了的名称便于用户浏览和搜索比如 demo-project别名帮助您更好的区分资源并支持中文名称比如 示例项目描述信息简单介绍该项目 高级设置 此处将默认的最大 CPU 和内存分别设置 1 Core和 1000 Mi后续的示例都可以在这个示例项目中完成在项目使用过程中可根据实际情况再次编辑资源默认请求。 完成高级设置后点击 创建。 说明高级设置是在当前项目中配置容器默认的 CPU 和内存的请求与限额相当于是给项目创建了一个 Kubernetes 的 LimitRange 对象在项目中创建工作负载后填写容器组模板时若不填写容器 CPU 和内存的请求与限额则容器会被分配在高级设置的默认 CPU 和内存请求与限额值。 提示项目管理和设置的详细说明请参考用户指南下的项目设置系列文档。 邀请成员 示例项目 gulimall 创建成功后点击进入示例项目。在 3.4、企业空间管理员步骤4. 已邀请用户 project-regular加入了当前企业空间 gulimall-workspace下一步则需要邀请 project-regular 用户进入该企业空间下的项目 gulimall 。点击项目列表中的 gulimall 进入该项目。 在项目的左侧菜单栏选择 项目设置 → 项目成员点击 邀请成员。在弹窗中的 project-regular点击 “”在项目的内置角色中选择 operator角色。因此后续在项目中创建和管理资源都可以由 project-regular用户登录后进行操作。 3.7. 请使用项目管理员 project-admin设置外网访问选择 「项目设置」 → 「外网访问」点击 「设置网关」。 第四步创建 DevOps 工程可选 说明DevOps 功能组件作为可选安装项提供 CI/CD 流水线、B2i/S2i 等丰富的企业级功能若还未安装可参考 自定义组件安装安装后 开启 DevOps 组件安装然后参考以下步骤。 继续使用 project-admin用户创建 DevOps 工程。点击 工作台在当前企业空间下点击 创建在弹窗中选择 创建一个 DevOps 工程。DevOps 工程的创建者 project-admin将默认为该工程的 Owner拥有 DevOps 工程的最高权限。 输入 DevOps 工程的名称和描述信息比如名称为 gulimall-devops。点击 创建注意创建一个 DevOps 有一个初始化环境的过程需要几秒钟。 点击 DevOps 工程列表中的 demo-devops进入该工程的详情页。 同上这一步需要在 demo-devops工程中邀请用户 project-regular并设置角色为 maintainer用于对工程内的 Pipeline、凭证等创建和配置等操作。菜单栏选择 工程管理 → 工程成员然后点击 邀请成员为用户 project-regular设置角色为 maintainer。后续在 DevOps 工程中创建 Pipeline 和凭证等资源都可以由 project-regular用户登录后进行操作。 至此本文档为您演示了如何在多租户的基础上使用账户管理和角色管理的功能以示例的方式介绍了常用内置角色的用法以及创建项目和 DevOps 工程。 4、创建 Wordpress 应用并发布至 Kubernetes 4.1、WordPress 简介 WordPress 是使用 PHP 开发的博客平台用户可以在支持 PHP 和 MySQL 数据库的环境中架设属于自己的网站。本文以创建一个 Wordpress 应用 为例以创建 KubeSphere 应用的形式将 Wordpress 的组件MySQL 和 Wordpress创建后发布至 Kubernetes 中并在集群外访问 Wordpress 服务。 一个完整的 Wordpress 应用会包括以下 Kubernetes 对象其中 MySQL 作为后端数据库Wordpress 本身作为前端提供浏览器访问。 4.2、前提条件 已创建了企业空间、项目和普通用户 project-regular账号该已账号已被邀请至示例项目并开启了外网访问请参考 多租户管理快速入门。 4.3、创建密钥 MySQL 的环境变量 MYSQL_ROOT_PASSWORD即 root 用户的密码属于敏感信息不适合以明文的方式表现在步骤中因此以创建密钥的方式来代替该环境变量。创建的密钥将在创建 MySQL 的容器组设置时作为环境变量写入。 4.3.1、创建 MySQL 密钥 以项目普通用户 project-regular登录 KubeSphere在当前项目下左侧菜单栏的 配置中心 选择 密钥点击 创建。 填写密钥的基本信息完成后点击 下一步。 名称作为 MySQL 容器中环境变量的名称可自定义例如 mysql-secret别名别名可以由任意字符组成帮助您更好的区分资源例如 MySQL 密钥描述信息简单介绍该密钥如 MySQL 初始密码 密钥设置页填写如下信息完成后点击 创建。 类型选择 默认(Opaque)DataData 键值对填写 MYSQL_ROOT_PASSWORD和 123456 4.3.2、创建 WordPress 密钥 同上创建一个 WordPress 密钥Data 键值对填写 WORDPRESS_DB_PASSWORD和 123456。此时两个密钥都创建完成。 4.4、创建存储卷 在当前项目下左侧菜单栏的 存储卷点击 创建基本信息如下。 名称wordpress-pvc别名Wordpress 持久化存储卷描述信息Wordpress PVC 完成后点击 下一步存储类型默认 local访问模式和存储卷容量也可以使用默认值点击 下一步直接创建即可。 同上方法创建mysql存储卷 4.5、创建应用 4.5.1、添加 MySQL 组件 1)、KubeSphere2.1 集成私有镜像仓库 Harbor 前置条件 因docker hub已经不允许访问我们添加容器镜像的时候无法从官网下载镜像所以我们需要自己搭建 docker私有仓库-Harbor。 KubeSphere集成本地容器镜像仓库 Harbor前提是我们需要有一个私有镜像仓库。如何搭建docker私有仓库-Harbor请参考文档docker搭建私有仓库 添加 Harbor 镜像仓库 Harbor 简介 Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器通过添加一些企业必需的功能特性例如安全、标识和管理等扩展了开源 Docker Distribution作为一个企业级私有 Registry 服务器Harbor 提供了更好的性能和安全。注意添加之前请确保已创建了 Harbor 镜像仓库服务端以下详细介绍如何在 KubeSphere 中添加 Harbor 镜像仓库。 登录 KubeSphere 管理控制台在已创建的项目中左侧菜单栏中选择 配置中心 → 密钥点击 创建。 填写镜像仓库的基本信息 名称为镜像仓库起一个简洁明了的名称便于浏览和搜索。别名帮助您更好的区分资源并支持中文名称。描述信息简单介绍镜像仓库的主要特性让用户进一步了解该镜像仓库。 密钥设置中类型选择 镜像仓库密钥填写镜像仓库的登录信息。 仓库地址用 Harbor 镜像仓库地址 192.168.119.133 作为示例用户名/密码填写 admin/ Harbor邮箱填写个人邮箱 点击 创建即可查看创建结果。 2)、添加 MySQL 组件 在左侧菜单栏选择 应用负载 → 应用然后点击 部署新应用。 基本信息中参考如下填写完成后在右侧点击 添加组件。 应用名称必填起一个简洁明了的名称便于用户浏览和搜索例如填写 wordpress-application描述信息简单介绍该工作负载方便用户进一步了解 参考如下提示完成 MySQL 组件信息 名称 mysql组件版本v1别名MySQL 数据库负载类型选择 有状态服务 点击 添加容器镜像镜像填写 mysql:5.6应指定镜像版本号)然后按回车键或点击 DockerHub点击 使用默认端口。 提示 : 注意DockerHub官网关闭了现在我们无法访问在此我们使用自己私有镜像仓库192.168.119.133/mysql/注意在高级设置中确保内存限制 ≥ 1000 Mi,否则可能 MySQL 会因内存 Limit 不够而无法启动。 下滑至环境变量在此勾选 环境变量然后选择 引用配置文件或密钥名称填写为 MYSQL_ROOT_PASSWORD下拉框中选择密钥为 mysql-secret和 MYSQL_ROOT_PASSWORD。 完成后点击右下角 √。 点击 添加存储卷模板为 MySQL 创建一个 PVC 实现数据持久化。 参考下图填写存储卷信息。 存储卷名称必填起一个简洁明了的名称便于用户浏览和搜索此处填写 mysql-pvc存储类型选择集群已有的存储类型如 Local容量和访问模式容量默认 10 Gi访问模式默认 ReadWriteOnce (单个节点读写)挂载路径存储卷在容器内的挂载路径选择 读写路径填写 /var/lib/mysql 完成后点击 √。 4.5.2、添加 WordPress 组件 参考如下提示完成 WordPress 组件信息 名称 wordpress组件版本v1别名Wordpress前端负载类型默认 无状态服务 点击 添加容器镜像镜像填写 wordpress:4.8-apache应指定镜像版本号)然后按回车键或点击 DockerHub点击 使用默认端口。 下滑至环境变量在此勾选 环境变量这里需要添加两个环境变量 点击 引用配置文件或密钥名称填写 WORDPRESS_DB_PASSWORD选择在第一步创建的配置 (Secret) wordpress-secret和 WORDPRESS_DB_PASSWORD。点击 添加环境变量名称填写 WORDPRESS_DB_HOST值填写 mysql对应的是上一步创建 MySQL 服务的名称否则无法连接 MySQL 数据库。 完成后点击 √。 提示 : 注意DockerHub官网关闭了现在我们无法访问在此我们使用自己私有镜像仓库192.168.119.133/mysql/ 点击 添加存储卷选择已有存储卷 wordpress-pvc访问模式改为 读写容器挂载路径 /var/www/html。完成后点击 √。 检查 WordPress 组件信息无误后再次点击 √此时 MySQL 和 WordPress 组件信息都已添加完成点击 创建。 4.5.3、查看应用资源 在 工作负载 下查看 部署 和 有状态副本集 的状态当它们都显示为 运行中说明 WordPress 应用创建成功。 点击 更多操作→ 编辑外网访问选择 NodePort然后该服务将在每个节点打开一个节点端口通过 点击访问即可在浏览器访问 WordPress。 访问 Wordpress 服务前查看 wordpress 服务将外网访问设置为 NodePort。 4.5.4、访问 Wordpress 以上访问将通过 http://{KaTeX parse error: Expected EOF, got } at position 6: 节点 IP}̲:{节点端口 NodePort}访问 WordPress 博客网站。 访问地址http://192.168.119.130:31836/ 选则简体中文 注册信息 并点击安装WordPress 安装完成进行登录 用户名 / 电子邮箱地址wts / atguigu-wordpressatguigu.com密码123456 登录成功页面 至此您已经熟悉了如何通过创建一个 KubeSphere 应用的方式通过快速添加多个组件来完成一个应用的构建最终发布至 Kubernetes。这种创建应用的形式非常适合微服务的构建只需要将各个组件容器化以后即可通过这种方式快速创建一个完整的微服务应用并发布 Kubernetes。 同时这种方式还支持用户以 无代码侵入的形式开启应用治理针对 微服务、流量治理、灰度发布与 Tracing 等应用场景开启应用治理后会在每个组件中以 SideCar 的方式注入 Istio-proxy 容器来接管流量后续将以一个 Bookinfo 的示例来说明如何在创建应用中使用应用治理。 4.5.5、应用部署的时候工作负载状态一直更新中查看日志发现有报错 journalctl -u kubelet -n 1006月 30 10:33:17 k8s-node1 kubelet[626]: E0630 10:33:17.078664 626 summary_sys_containers.go:47] Failed to get system container stats for /system.slice/docker.service: failed to get cgroup stats for /system.s lice/docker.service: failed to get container info for /system.slice/docker.service: unknown container /system.slice/docker.service 6月 30 10:33:22 k8s-node1 kubelet[626]: E0630 10:33:22.207119 626 pod_workers.go:191] Error syncing pod 6bc8a4d3-fab3-4938-a54d-36fb15f9c864 (alerting-client-685d4d47fc-7gkjg_kubesphere-alerting-system(6bc8a4d 3-fab3-4938-a54d-36fb15f9c864)), skipping: failed to StartContainer for alerting-client with CrashLoopBackOff: back-off 5m0s restarting failed containeralerting-client podalerting-client-685d4d47fc-7gkjg_ku besphere-alerting-system(6bc8a4d3-fab3-4938-a54d-36fb15f9c864) 6月 30 10:33:23 k8s-node1 kubelet[626]: E0630 10:33:23.208725 626 pod_workers.go:191] Error syncing pod 815f19d1-da0d-467f-a16b-79193ccbae39 (kube-flannel-ds-lqhbw_kube-flannel(815f19d1-da0d-467f-a16b-79193ccb ae39)), skipping: failed to StartContainer for install-cni-plugin with ImagePullBackOff: Back-off pulling image \docker.io/flannel/flannel-cni-plugin:v1.4.1-flannel1\ 6月 30 10:33:26 k8s-node1 kubelet[626]: E0630 10:33:26.207183 626 pod_workers.go:191] Error syncing pod e5168039-6100-41a4-bba2-55fc0d856abf (ks-sonarqube-sonarqube-f68dd5ff5-bl9fk_kubesphere-devops-system(e51 68039-6100-41a4-bba2-55fc0d856abf)), skipping: failed to StartContainer for sonarqube with CrashLoopBackOff: back-off 5m0s restarting failed containersonarqube podks-sonarqube-sonarqube-f68dd5ff5-bl9fk_kube sphere-devops-system(e5168039-6100-41a4-bba2-55fc0d856abf)解决办法 vi /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf修改kubelet配置文件在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件中增加环境配置 EnvironmentKUBELET_CGROUP_ARGS--runtime-cgroups/systemd/system.slice --kubelet-cgroups/systemd/system.slice并在启动命令尾部添加变量 $KUBELET_CGROUP_ARGS如下 ExecStart/usr/local/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_CGROUP_ARGS重启 kubelet 服务让 kubelet 重新加载配置。 systemctl daemon-reload systemctl restart kubelet四、DevOps 1、项目开发需要考虑的维度 Dev怎么开发 Ops怎么运维 高并发怎么承担高并发 高可用怎么做到高可用 2、什么是 DevOps 微服务服务自治。 DevOps: Development 和 Operations 的组合 DevOps 看作开发软件工程、技术运营和质量保障QA三者的交集。突出重视软件开发人员和运维人员的沟通合作通过自动化流程来使得软件构建、测试、 发布更加快捷、频繁和可靠。DevOps 希望做到的是软件产品交付过程中 IT 工具链的打通使得各个团队减少时间损 耗更加高效地协同工作。专家们总结出了下面这个 DevOps 能力图良好的闭环可以大大 增加整体的产出。 3、什么是 CICD 3.1、持续集成Continuous Integration 持续集成是指软件个人研发的部分向软件整体部分交付频繁进行集成以便更快地发现其中的错误。“持续集成”源自于极限编程XP是 XP 最初的 12 种实践之一。CI 需要具备这些 全面的自动化测试。这是实践持续集成持续部署的基础同时选择合适的 自动化测试工具也极其重要灵活的基础设施。容器虚拟机的存在让开发人员和 QA 人员不必再大费周折版本控制工具。如 GitCVSSVN 等自动化的构建和软件发布流程的工具。如 Jenkinsflow.ci反馈机制。如构建/测试的失败可以快速地反馈到相关负责人以尽快解决达到一个更稳定的版本。 3.2、持续交付Continuous Delivery 持续交付在持续集成的基础上将集成后的代码部署到更贴近真实运行环境的「类生产环境」 production-like environments中。持续交付优先于整个产品生命周期的软件部署建立在高水平自动化持续集成之上。 灰度发布。 持续交付和持续集成的优点非常相似 快速发布。能够应对业务需求并更快地实现软件价值。编码-测试-上线-交付的频繁迭代周期缩短同时获得迅速反馈高质量的软件发布标准。整个交付过程标准化、可重复、可靠整个交付过程进度可视化方便团队人员了解项目成熟度更先进的团队协作方式。从需求分析、产品的用户体验到交互 设计、开发、测试、运维等角色密切协作相比于传统的瀑布式软件团队更少浪费。 3.3、持续部署Continuous Deployment 持续部署是指当交付的代码通过评审之后自动部署到生产环境中。持续部署是持续交付的最高阶段。这意味着所有通过了一系列的自动化测试的改动都将自动部署到生产环境。它也可以被称为“Continuous Release”。 “开发人员提交代码持续集成服务器获取代码执行单元测试根据测试结果决定是否部署到预演环境如果成功部署到预演环境进行整体验收测试如果测试通过自动部署到产品环境全程自动化高效运转。“ 持续部署主要好处是可以相对独立地部署新的功能并能快速地收集真实用户的反馈。 “You build it, you run it”这是 Amazon 一年可以完成 5000 万次部署 平均每个工程师每天部署超过 50 次的核心秘籍。 下图是由 Jams Bowman 绘制的持续交付工具链图 4、落地方案 MavenGithubJenkinsHudson[现由甲骨文维护]Docker 自动化部署 5、基于Spring Boot项目构建流水线 https://v2-1.docs.kubesphere.io/docs/zh-CN/quick-start/devops-online/ Jenkinsfile in SCM 意为将 Jenkinsfile 文件本身作为源代码管理 (Source Control Management) 的一部分根据该文件内的流水线配置信息快速构建工程内的 CI/CD 功能模块比如阶段 (Stage)步骤 (Step) 和任务 (Job)。因此在代码仓库中应包含 Jenkinsfile。 5.1、目的 本示例演示如何通过 GitHub 仓库中的 Jenkinsfile 来创建流水线流水线共包括 8 个阶段最终将演示示例部署到 KubeSphere 集群中的开发环境和生产环境且能够通过公网访问。 仓库中的 dependency 分支为缓存测试用例测试方式与 master 分支类似对 dependency 的多次构建可体现出利用缓存可以有效的提升构建速度。 5.2、前提条件 开启安装了 DevOps 功能组件参考 安装 DevOps 系统本示例以 GitHub 和 DockerHub 为例参考前确保已创建了 GitHub 和 DockerHub 账号 已创建了企业空间和 DevOps 工程并且创建了项目普通用户 project-regular 的账号若还未创建请参考 多租户管理快速入门使用项目管理员 project-admin邀请项目普通用户 project-regular加入 DevOps 工程并授予 maintainer角色若还未邀请请参考 多租户管理快速入门 - 邀请成员。参考 配置 ci 节点为流水线选择执行构建的节点。 5.3、流水线概览 下面的流程图简单说明了流水线完整的工作过程 流程说明 阶段一. Checkout SCM: 拉取 GitHub 仓库代码阶段二. Unit test: 单元测试如果测试通过了才继续下面的任务阶段三. SonarQube analysissonarQube 代码质量检测阶段四. Build push snapshot image: 根据行为策略中所选择分支来构建镜像并将 tag 为 SNAPSHOT- B R A N C H N A M E − BRANCH_NAME- BRANCHN​AME−BUILD_NUMBER推送至 Harbor (其中 $BUILD_NUMBER为 pipeline 活动列表的运行序号)。阶段五. Push latest image: 将 master 分支打上 tag 为 latest并推送至 DockerHub。阶段六. Deploy to dev: 将 master 分支部署到 Dev 环境此阶段需要审核。阶段七. Push with tag: 生成 tag 并 release 到 GitHub并推送到 DockerHub。阶段八. Deploy to production: 将发布的 tag 部署到 Production 环境。 5.4、创建凭证 注意 GitHub 账号或密码带有 “” 这类特殊字符需要创建凭证前对其进行 urlencode 编码可通过一些 第三方网站 进行转换然后再将转换后的结果粘贴到对应的凭证信息中。这里需要创建的是凭证Credential不是密钥Secret。 在 多租户管理快速入门 中已给项目普通用户 project-regular 授予了 maintainer 的角色因此使用 project-regular 登录 KubeSphere进入已创建的 devops-demo 工程开始创建凭证。 1、本示例代码仓库中的 Jenkinsfile 需要用到 DockerHub、GitHub 和 kubeconfig (kubeconfig 用于访问接入正在运行的 Kubernetes 集群) 等一共 3 个凭证 (credentials) 参考 创建凭证依次创建这三个凭证。 2、然后参考 访问 SonarQube 并创建 Token创建一个 Java 的 Token 并复制。 3、最后在 KubeSphere 中进入 gulimall-devops的 DevOps 工程中与上面步骤类似在 凭证 下点击 创建创建一个类型为 秘密文本的凭证凭证 ID 命名为 sonar-token密钥为上一步复制的 token 信息完成后点击 确定。 创建 Harbor 凭证 创建一个用于 内置 Harbor 登录的凭证此处命名为 harbor-id类型选择 账户凭证。用户名和密码填写 admin 和 Harbor12345完成后点击 确定。 创建 GitHub 凭证 同上创建一个用于 GitHub 的凭证凭证 ID 可命名为 github-id类型选择 账户凭证输入您个人的 GitHub 用户名和密码备注描述信息完成后点击 确定。 注意github 的认证策略发生了改变在 2021年8月13日的时候用户名加密码的认证方式被去掉了换成了 个人令牌Personal Access Token的校验方式。所以我们这里使用token 创建token的具体操作步骤可以参考文档https://blog.csdn.net/liuzehn/article/details/128037853 创建 kubeconfig 凭证 在 凭证 下点击 创建创建一个类型为 kubeconfig的凭证凭证 ID 可命名为 demo-kubeconfig完成后点击 确定。 说明kubeconfig 类型的凭证用于访问接入正在运行的 Kubernetes 集群在流水线部署步骤将用到该凭证。注意此处的 Content 将自动获取当前 KubeSphere 中的 kubeconfig 文件内容若部署至当前 KubeSphere 中则无需修改若部署至其它 Kubernetes 集群则需要将其 kubeconfig 文件的内容粘贴至 Content 中。 访问 SonarQube 并创建 Token创建一个 Java 的 Token 并复制 我们显示通过kubectl get svc --all-namespaces命令找到SonarQube服务可以看到端口信息 kubectl get svc --all-namespaces访问地址http://192.168.119.130:30433/ 账号admin 密码admin d7aaab890a1a387653f98bf6477a7558457db727创建 SonarQube Token 5.5、修改 Jenkinsfile 5.5.1、第一步Fork项目 登录 GitHub将本示例用到的 GitHub 仓库 devops-java-sample Fork 至您个人的 GitHub。 5.5.2、第二步修改 Jenkinsfile 1、Fork 至您个人的 GitHub 后在 根目录 进入 Jenkinsfile-online。 2、在 GitHub UI 点击编辑图标需要修改如下环境变量 (environment) 的值。 修改项值含义DOCKER_CREDENTIAL_IDdockerhub-id填写创建凭证步骤中的 DockerHub 凭证 ID用于登录您的 DockerHubGITHUB_CREDENTIAL_IDgithub-id填写创建凭证步骤中的 GitHub 凭证 ID用于推送 tag 到 GitHub 仓库KUBECONFIG_CREDENTIAL_IDdemo-kubeconfigkubeconfig 凭证 ID用于访问接入正在运行的 Kubernetes 集群REGISTRYdocker.io默认为 docker.io 域名用于镜像的推送DOCKERHUB_NAMESPACEyour-dockerhub-account替换为您的 DockerHub 账号名(它也可以是账户下的 Organization 名称)GITHUB_ACCOUNTyour-github-account替换为您的 GitHub 账号名例如 https://github.com/kubesphere/则填写 kubesphere(它也可以是账户下的 Organization 名称)APP_NAMEdevops-java-sample应用名称SONAR_CREDENTIAL_IDsonar-token填写创建凭证步骤中的 SonarQube token凭证 ID用于代码质量检测 修改后的内容 environment {DOCKER_CREDENTIAL_ID harbor-idGITHUB_CREDENTIAL_ID github-idKUBECONFIG_CREDENTIAL_ID demo-kubeconfigREGISTRY 192.168.119.133/gulimall/DOCKERHUB_NAMESPACE adminGITHUB_ACCOUNT WangTianShunAPP_NAME devops-java-sampleSONAR_CREDENTIAL_ID sonar-token}注master分支 Jenkinsfile 中 mvn命令的参数 -o表示开启离线模式。本示例为适应某些环境下网络的干扰以及避免在下载依赖时耗时太长已事先完成相关依赖的下载默认开启离线模式。 3、修改以上的环境变量后点击 Commit changes将更新提交到当前的 master 分支。 5.6、创建项目 CI/CD 流水线会根据示例项目的 yaml 模板文件最终将示例分别部署到 kubesphere-sample-dev和 kubesphere-sample-prod这两个项目 (Namespace) 环境中这两个项目需要预先在控制台依次创建参考如下步骤创建该项目。 5.6.1、第一步创建第一个项目 提示项目管理员 project-admin账号已在 多租户管理快速入门 中创建。 1、使用项目管理员 project-admin账号登录 KubeSphere在之前创建的企业空间 (gulimall-workspace) 下点击 项目 → 创建创建一个 资源型项目作为本示例的开发环境填写该项目的基本信息完成后点击 下一步。 名称固定为 kubesphere-sample-dev若需要修改项目名称则需在 yaml 模板文件 中修改 namespace 别名可自定义比如 开发环境 描述信息可简单介绍该项目方便用户进一步了解 2、本示例暂无资源请求和限制因此高级设置中无需修改默认值点击 创建项目可创建成功。 3、邀请成员 第一个项目创建完后还需要项目管理员 project-admin邀请当前的项目普通用户 project-regular进入 kubesphere-sample-dev项目进入**「项目设置」→「项目成员」点击「邀请成员」**选择邀请 project-regular并授予 operator角色 。 5.6.2、第二步创建第二个项目 同上参考以上两步创建一个名称为 kubesphere-sample-prod的项目作为生产环境并邀请普通用户 project-regular进入 kubesphere-sample-prod项目并授予 operator角色。 3、kubesphere-sample-prod创建同上 说明当 CI/CD 流水线后续执行成功后在 kubesphere-sample-dev和 kubesphere-sample-prod项目中将看到流水线创建的部署 (Deployment) 和服务 (Service)。 5.7、创建流水线 5.7.1、第一步填写基本信息 1、进入已创建的 DevOps 工程选择左侧菜单栏的 流水线然后点击 创建。 2、在弹出的窗口中输入流水线的基本信息。 名称为创建的流水线起一个简洁明了的名称便于理解和搜索描述信息简单介绍流水线的主要特性帮助进一步了解流水线的作用代码仓库点击选择代码仓库代码仓库需已存在 Jenkinsfile 5.7.2、第二步添加仓库 1、点击代码仓库以添加 Github 仓库为例。 2、点击弹窗中的 获取 Token。 3、在 GitHub 的 access token 页面填写 Token description简单描述该 token如 DevOps demo在 Select scopes 中无需任何修改点击 Generate tokenGitHub 将生成一串字母和数字组成的 token 用于访问当前账户下的 GitHub repo。 4、复制生成的 token在 KubeSphere Token 框中输入该 token 然后点击保存。 5、验证通过后右侧会列出此 Token 关联用户的所有代码库选择其中一个带有 Jenkinsfile 的仓库。比如此处选择准备好的示例仓库 devops-java-sample点击 选择此仓库完成后点击 下一步。 5.7.3、第三步高级设置 完成代码仓库相关设置后进入高级设置页面高级设置支持对流水线的构建记录、行为策略、定期扫描等设置的定制化以下对用到的相关配置作简单释义。 1、分支设置中勾选 丢弃旧的分支此处的 保留分支的天数 和 保留分支的最大个数 默认为 -1。 说明 分支设置的保留分支的天数和保持分支的最大个数两个选项可以同时对分支进行作用只要某个分支的保留 天数和个数不满足任何一个设置的条件则将丢弃该分支。假设设置的保留天数和个数为 2 和 3则分支的保留天数一旦超过 2 或者保留个数超过 3则将丢弃该分支。默认两个值为 -1表示将会丢弃已经被删除的分支。 丢弃旧的分支将确定何时应丢弃项目的分支记录。分支记录包括控制台输出存档工件以及与特定分支相关的其他元数据。保持较少的分支可以节省 Jenkins 所使用的磁盘空间我们提供了两个选项来确定应何时丢弃旧的分支 保留分支的天数如果分支达到一定的天数则丢弃分支。保留分支的个数如果已经存在一定数量的分支则丢弃最旧的分支。 2、行为策略中KubeSphere 默认添加了三种策略。由于本示例还未用到 从 Fork 仓库中发现 PR 这条策略此处可以删除该策略点击右侧删除按钮。 说明 支持添加三种类型的发现策略。需要说明的是在 Jenkins 流水线被触发时开发者提交的 PR (Pull Request) 也被视为一个单独的分支。 发现分支 排除也作为 PR 提交的分支选择此项表示 CI 将不会扫描源分支 (比如 Origin 的 master branch)也就是需要被 merge 的分支只有被提交为 PR 的分支仅扫描 PR 分支所有分支拉取的仓库 (origin) 中所有的分支 从原仓库中发现 PR PR 与目标分支合并后的源代码版本一次发现操作基于 PR 与目标分支合并后的源代码版本创建并运行流 水线PR 本身的源代码版本一次发现操作基于 PR 本身的源代码版本创建并运行流水线当 PR 被发现时会创建两个流水线一个流水线使用 PR 本身的源代码版本一个流水线使用 PR 与目标分 - 支合并后的源代码版本两次发现操作将分别创建两条流水线第一条流水线使用 PR 本身的源代码版本第二条流水线使用 PR 与目标分支合并后的源代码版本。 3、默认的 脚本路径 为 Jenkinsfile请将其修改为 Jenkinsfile-online。 注路径是 Jenkinsfile 在代码仓库的路径表示它在示例仓库的根目录若文件位置变动则需修改其脚本路径。 4、在 扫描 Repo Trigger 勾选 如果没有扫描触发则定期扫描扫描时间间隔可根据团队习惯设定本示例设置为 5 minutes。 说明定期扫描是设定一个周期让流水线周期性地扫描远程仓库根据 行为策略 查看仓库有没有代码更新或新的 PR。 Webhook 推送 Webhook 是一种高效的方式可以让流水线发现远程仓库的变化并自动触发新的运行GitHub 和 Git (如 Gitlab) 触发 Jenkins 自动扫描应该以 Webhook 为主以上一步在 KubeSphere 设置定期扫描为辅。在本示例中可以通过手动运行流水线如需设置自动扫描远端分支并触发运行详见 设置自动触发扫描 - GitHub SCM。 完成高级设置后点击 创建。 5.7.4、第四步运行流水线 流水线创建后点击浏览器的 刷新 按钮可见两条自动触发远程分支后的运行记录分别为 master和 dependency分支的构建记录。 1、点击右侧 运行将根据上一步的 行为策略 自动扫描代码仓库中的分支在弹窗选择需要构建流水线的 master分支系统将根据输入的分支加载 Jenkinsfile-online (默认是根目录下的 Jenkinsfile)。 2、由于仓库的 Jenkinsfile-online 中 TAG_NAME: defaultValue没有设置默认值因此在这里的 TAG_NAME可以输入一个 tag 编号比如输入 v0.0.1。 3、点击 确定将新生成一条流水线活动开始运行。 说明: tag 用于在 Github 和DockerHub 中分别生成带有 tag 的 release 和镜像。 注意: 在主动运行流水线以发布 release 时TAG_NAME不应与之前代码仓库中所存在的 tag名称重复如果重复会导致流水线的运行失败。 至此流水线 已完成创建并开始运行。 注点击 分支 切换到分支列表查看流水线具体是基于哪些分支运行这里的分支则取决于上一步 行为策略 的发现分支策略。 5.7.5、第五步审核流水线 为方便演示此处默认用当前账户来审核当流水线执行至 input步骤时状态将暂停需要手动点击 继续流水线才能继续运行。注意在 Jenkinsfile-online 中分别定义了三个阶段 (stage) 用来部署至 Dev 环境和 Production 环境以及推送 tag因此在流水线中依次需要对 deploy to dev, push with tag, deploy to production这三个阶段审核 3次若不审核或点击 终止 则流水线将不会继续运行。 说明在实际的开发生产场景下可能需要更高权限的管理员或运维人员来审核流水线和镜像并决定是否允许将其推送至代码或镜像仓库以及部署至开发或生产环境。Jenkinsfile 中的 input步骤支持指定用户审核流水线比如要指定用户名为 project-admin 的用户来审核可以在 Jenkinsfile 的 input 函数中追加一个字段如果是多个用户则通过逗号分隔如下所示 ··· input(id: release-image-with-tag, message: release image with tag?, submitter: project-admin,project-admin1) ···5.8、查看流水线 1、点击流水线中 活动列表下当前正在运行的流水线序列号页面展现了流水线中每一步骤的运行状态注意流水线刚创建时处于初始化阶段可能仅显示日志窗口待初始化 (约一分钟) 完成后即可看到流水线。黑色框标注了流水线的步骤名称示例中流水线共 8 个 stage分别在 Jenkinsfile-online 中被定义。 2、当前页面中点击右上方的 查看日志查看流水线运行日志。页面展示了每一步的具体日志、运行状态及时间等信息点击左侧某个具体的阶段可展开查看其具体的日志。日志可下载至本地如出现错误下载至本地更便于分析定位问题。
http://www.hkea.cn/news/14284433/

相关文章:

  • 陕西省建设厅管理中心网站好点的开发网站的公司
  • 手表排名哪个网站好58同城官网
  • 网站建设使用的什么软件有哪些优质网站策划
  • 做网站低价一整套室内设计方案ppt
  • 上海备案证查询网站查询系统手机网站建设基本流程图
  • 个人征信系统查询官网wordpress 自动seo插件
  • 逸阳网站建设的目标wordpress文章目录页面
  • 网站建设 数据可视化网站开发考什么证
  • 爱发电怎么做网站西安企业网站建设多少钱
  • 如何实现网站开发手机验证码centos 安装wordpress
  • 西安网站微信开发企业用什么邮箱比较好
  • 华为云做网站网站开发工期安排表
  • 正规的网站制作平台北京百度seo点击器
  • 南通网站seo报价企业网站推广计划书
  • 中企建网站dede做网站
  • 哪个网站推广好wordpress 4.7.1
  • 网站打开速度太慢做网站收录
  • 环境艺术设计网站推荐做一个学校网站怎么做
  • 自己做网站怎么上传到网上网银在线北京网络科技有限公司
  • 我学的 网站开发 能进华为公司么国家知识产权专利网官网
  • 做包装看什么网站别人的网站是怎么找到的
  • 台州网站搭建智慧管网建设方案
  • 网站建设自学建站视频教程网站解析时候让做别名
  • 南宁有做网站的公司吗wordpress编辑器失效
  • 国际网站浏览器网站建设怎么记账
  • 网站里面如何在新闻列表上显示hot中山网站建设哪家便宜
  • 建网站多少钱 优帮云淘宝领卷网站什么做
  • 网站后台模板关联自己做的网站怎么做祝福网站
  • 顺义区做网站wordpress防止
  • 吉林网站建设哪家有工程招聘app都有哪些