- 上周内容回顾 见视频。 - docker和k8s的时间简史 - Docker基于Go编写的程序,在2013年开源。 - kubernetes(K8S)在2014年Google公司开源,底层使用的是docker作为容器运行时。 - Docker swarm - coreOS的公司早期是docker的使用者,coreOS公司自研了rkt容器运行时,这家公司还开源了Flannel。 - 2015年Google将K8S捐献给了CNCF组织,这意味着K8S不再有Google说了算,领头人Google和RedHat的公司对K8S的代码捐献很大,后续国内外很多K8S加入,阿 ... - 后续时间: 阿里云: 容器服务 Kubernetes 版 ACK 腾讯云: 腾讯云容器服务(Tencent Kubernetes Engine ,TKE) 华为云: 云容器引擎 CCE - 2016 市场占用率,基本上K8S完胜。docker惜败。 rkt站队K8S,但是用户已经对docker比较熟练了,rkt市场氛围较低。 CNCF官方宣传,docker不在是唯一的容器运行时,也支持rkt,也推出了CRI(Container Runtime Interface)接口,凡是符合该开发规范的容器接口的容器管理工具,均可以运行在K8S之上。 但是docker和rkt都支持,于是Google公司牵头,实现了docker的CRI,开源了一个docker-shim的组件,说白了,该组件就是调用docker的API(支持CRI),然后供给K8S使用。 rkt有RedHat公司基于cri-o开发框架,也支持在K8S上运行。 - 2017 docker将containerd容器运行时贡献给CNCF组织。 可惜,containerd也不支持CRI,于是很多社区大佬联合开发了CRI接口,在K8S 1.11版本之后,就可以直接使用containerd作为容器运行时。 - 2018: coreOS公司被RedHat收购。并宣布对rkt的停止维护。 - 2019: docker公司也Mirantis(做云计算的,对OpenStack代码贡献量非常大)被收购,收购后说会对docker swarm最少保留2年的维护,未来重心放在K8S。 - 2020: CNCF直接宣布弃用docker运行时,使用containerd作为底层的容器运行时。 - 2022年: k8s 1.24版本发布后,就直接弃用了docker运行时,而docker-shim组件不再维护,但是Mirantis和docker说会继续对该组件维护。 对于开发来说: 不影响,直接正常使用。 对于运维来说: 在部署时,如果想要使用docker运行时,需要独立部署cri-docker组件。 - 2024年: K82 1.30横空出世! - 生产环环境中k8s版本选择: 1.推荐1.23.17版本,因为该版本是k8s官方支持的最后一个docker容器运行时。 2.当然,你也可以使用更高的版本,如果想要使用docker的话,需要手动部署cri-dockerd。 3.对往期学长的K8S调研,发现市面上用的较多的K8S版本有1.13,1.15,1.17,1.19,1.21,1.22,1.23 - k8s是什么?能干啥?K8S能解决什么问题? 所谓K8S,全称"Kubernetes",是容器编排工具。 所谓的容器编排工具,可以简单理解就是管理容器的生命周期,如何在集群节点进行调度部署,日志,监控维护等。 docker使用的缺陷: 1.容器重启后,可能IP地址会发生变化,对于跨主机互联来说,不太方便; 2.不便于集群调度; 3.不方便集群监控,管理; 4.不便于做健康检查,无法实现故障资源; 5.跨节点存储卷挂载问题?维护起来不方便; 6.多个节点容器实现配置共享? ... 综上所述,这些缺点,K8S全能实现。 - 为什么要学习K8S? 1.k8s能够解决docker一些跨节点的问题,包括但不限于:部署,监控,调度,配置等; 2.能够提高运维的工作效率,而且支持Jenkins实现CI/CD; 3.运维找工作,基本上K8S成为了标配; 4.知识积累,便于跳槽? - k8s架构如何? - master: 主人,并不部署服务,而是管理salve节点。 后期更名为: controll plane,控制面板。 etcd: KEY-VALUE键值对数据库,基于Go语言开发。并不是K8S官方的组件,而是使用了开源项目etcd数据库。 主要作用为K8S存储数据,支持以集群的方式部署。 默认监听的端口: 2379~2380 api-server: 是K8S集群控制的访问入口,说白了,维护者用于控制K8S的入口。 默认监听的端口: 8080(http) | 6443(https,默认) scheduler: 负责容器调度到哪些worker node节点。 controller manager: 控制器管理者,维护集群状态。 - slave: 奴隶。部署实际的服务,以供客户端访问。 后期更名为:worker node, 工作节点 kubelet: 负责K8S的容器的生命周期(包括但不限于创建,删除,修改,监控),并监控容器上报给api-server。 kube-proxy: 负责为找到容器的IP提供负载均衡,可以理解为用于为容器提供统一的访问入口,优点类似于负载均衡器的效果。 底层支持: iptables和ipvs工作模式,生产环境中推荐大家使用ipvs模式。 - CNI: 为容器提供跨主机节点通信的网络。 - K8S的三种网络类型 - K8S各组件通信的网络 使用时物理网卡,默认网段: 10.0.0.0/24。 - 跨节点容器实现通信的网段: 用户可以自定义,学习环境推荐: 10.100.0.0/16。 但是在自定义网段时,要考虑将来能够分片的IP地址数量,"10.100.0.0/16"最多有65536个IP地址。 如果将来容器运行的数量超过该规模时,应该考虑将网段地址调大,比如"10.0.0.0/8"。 - Service网段: 为容器提供负载均衡和服务发现功能。也是需要一个独立的网段,比如"10.200.0.0/16"最多有65536个IP地址。 同理,如果规模较大时,应该考虑网段分配的问题。 - K8S常见的部署方式对比及CNCF项目: - 官方提供 - 二进制部署K8S集群 手动部署K8S各个组件,配置文件,启动脚本及证书生成,kubeconfig文件。 对新手不友好,尤其是证书管理。对K8S玩熟练的小伙伴需要2小时起步。 - kubeadm部署K8S集群 是官方提供的一种快速部署K8S各组件的搭建,如果镜像准备就绪的情况下,基于容器的方式部署,新手估计就1-2分钟部署完成。 需要提前安装kubelet,docker或者containerd,kubeadm组件。 - 第三方提供的部署方式: 国内公司: - 青云科技: kubesphere 底层基于kubeadm快速部署K8S,提供了丰富的图形化管理界面。 - kuboard 底层基于kubeadm快速部署K8S,提供了丰富的图形化管理界面。 - kubeasz 底层基于二进制方式部署,结合ansible的playbook实现的快速部署管理K8S集群。 国外的产品: - rancher: 和国内的kubesphere很相似,也是K8S发行商,提供了丰富的图形化管理界面。 还基于K8S研发出来了K3S,号称轻量级的K8S。 云厂商: - 阿里云: ACK - 腾讯云: TKE - 华为云: CCE - 京东云: Kubernetes - .... 其他部署方式: - minikube: 适合在windows部署K8S,适合开发环境搭建的使用。不建议生产环境部署。 - kind: 可以部署多套K8S环境,轻量级的命令行管理工具。 - yum: 不推荐,版本支持较低,默认是1.5.2。 CNCF技术蓝图: https://landscape.cncf.io/ - harbor的基于自建证书的https案例 1.部署docker和docker-compose 1.1 解压软件包 [root@harbor.oldboyedu.com ~]# tar xf oldboyedu-autoinstall-docker-docker-compose.tar.gz 1.2 安装docker和docker-compose运行时 [root@harbor.oldboyedu.com ~]# ./install-docker.sh i 1.3 查看版本 [root@harbor.oldboyedu.com ~]# docker --version Docker version 20.10.24, build 297e128 [root@harbor.oldboyedu.com ~]# [root@harbor.oldboyedu.com ~]# docker-compose --version Docker Compose version v2.23.0 [root@harbor.oldboyedu.com ~]# 2.安装harbor 1.下载harbor 略。 2.解压软件包 [root@harbor.oldboyedu.com ~]# tar xf harbor-offline-installer-v2.7.4.tgz -C /oldboyedu/softwares/ 3.创建证书的工作目录 [root@harbor.oldboyedu.com ~]# mkdir -pv /oldboyedu/softwares/harbor/certs/{ca,harbor-server,docker-client} mkdir: created directory '/oldboyedu/softwares/harbor/certs' mkdir: created directory '/oldboyedu/softwares/harbor/certs/ca' # 将来存储的是自建CA证书 mkdir: created directory '/oldboyedu/softwares/harbor/certs/harbor-server' # harbor服务端使用的证书 mkdir: created directory '/oldboyedu/softwares/harbor/certs/docker-client' # harbor客户端链接时使用的证书文件 [root@harbor.oldboyedu.com ~]# 4.进入到harbor证书存放目录 [root@harbor.oldboyedu.com ~]# cd /oldboyedu/softwares/harbor/certs/ [root@harbor.oldboyedu.com certs]# [root@harbor.oldboyedu.com certs]# ll total 0 drwxr-xr-x 2 root root 6 Feb 27 09:06 ca drwxr-xr-x 2 root root 6 Feb 27 09:06 docker-client drwxr-xr-x 2 root root 6 Feb 27 09:06 harbor-server [root@harbor.oldboyedu.com certs]# 5.生成自建CA证书 5.1 创建CA的私钥 [root@harbor.oldboyedu.com certs]# openssl genrsa -out ca/ca.key 4096 5.2 基于自建的CA私钥创建CA证书(注意,证书签发的域名范围) [root@harbor.oldboyedu.com certs]# openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=oldboyedu.com" \ -key ca/ca.key \ -out ca/ca.crt 5.3 查看自建证书信息 [root@harbor.oldboyedu.com certs]# openssl x509 -in ca/ca.crt -noout -text 6.配置harbor证书 6.1 生成harbor服务器的私钥 [root@harbor.oldboyedu.com certs]# openssl genrsa -out harbor-server/harbor.oldboyedu.com.key 4096 6.2 harbor服务器基于私钥签发证书认证请求(csr文件),让自建CA认证 [root@harbor.oldboyedu.com certs]# openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.oldboyedu.com" \ -key harbor-server/harbor.oldboyedu.com.key \ -out harbor-server/harbor.oldboyedu.com.csr 6.3 生成 x509 v3 的扩展文件用于认证 cat > harbor-server/v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1=harbor.oldboyedu.com EOF 6.4 基于 x509 v3 的扩展文件认证签发harbor server证书 [root@harbor.oldboyedu.com certs]# openssl x509 -req -sha512 -days 3650 \ -extfile harbor-server/v3.ext \ -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial \ -in harbor-server/harbor.oldboyedu.com.csr \ -out harbor-server/harbor.oldboyedu.com.crt 7.修改harbor的配置文件使用自建证书 7.1 修改harbor的配置文件 [root@harbor.oldboyedu.com certs]# pwd /oldboyedu/softwares/harbor/certs [root@harbor.oldboyedu.com certs]# [root@harbor.oldboyedu.com certs]# cd .. [root@harbor.oldboyedu.com harbor]# [root@harbor.oldboyedu.com harbor]# cp harbor.yml{.tmpl,} [root@harbor.oldboyedu.com harbor]# [root@harbor.oldboyedu.com harbor]# vim harbor.yml ... hostname: harbor.oldboyedu.com https: ... certificate: /oldboyedu/softwares/harbor/certs/harbor-server/harbor.oldboyedu.com.crt private_key: /oldboyedu/softwares/harbor/certs/harbor-server/harbor.oldboyedu.com.key ... harbor_admin_password: 1 ... data_volume: /oldboyedu/data/harbor .. [root@harbor.oldboyedu.com harbor]# 7.2 开始安装harbor [root@harbor.oldboyedu.com harbor]# ll total 742112 drwxr-xr-x 3 root root 4096 Jul 29 07:24 ./ drwxr-xr-x 4 root root 4096 Jul 29 07:15 ../ drwxr-xr-x 5 root root 4096 Jul 29 07:15 certs/ -rw-r--r-- 1 root root 3639 Nov 29 2023 common.sh -rw-r--r-- 1 root root 759846754 Nov 29 2023 harbor.v2.7.4.tar.gz -rw-r--r-- 1 root root 12528 Jul 29 07:24 harbor.yml -rw-r--r-- 1 root root 12330 Nov 29 2023 harbor.yml.tmpl -rwxr-xr-x 1 root root 3171 Nov 29 2023 install.sh* -rw-r--r-- 1 root root 11347 Nov 29 2023 LICENSE -rwxr-xr-x 1 root root 1881 Nov 29 2023 prepare* [root@harbor.oldboyedu.com harbor]# [root@harbor.oldboyedu.com harbor]# [root@harbor.oldboyedu.com harbor]# ./install.sh --with-chartmuseum 7.3 检查是否是否正常 https://harbor.oldboyedu.com/harbor/projects/1/helm-charts 温馨提示: 此步骤,需要windows中添加hosts解析哟 10.0.0.250 harbor.oldbooyedu.com - K8S集群节点配置docker客户端证书 1.K8S所有节点操作 1.1 安装docker环境 tar xf oldboyedu-autoinstall-docker-docker-compose.tar.gz ./install-docker.sh i 1.2 配置hosts文件解析 cat >> /etc/hosts << EOF 10.0.0.250 harbor.oldboyedu.com 10.0.0.231 master231 10.0.0.232 worker232 10.0.0.233 worker233 EOF 2.harbor服务端生成docker客户端证书 [root@harbor.oldboyedu.com certs]# pwd /oldboyedu/softwares/harbor/certs [root@harbor.oldboyedu.com certs]# [root@harbor.oldboyedu.com certs]# openssl x509 -inform PEM -in harbor-server/harbor.oldboyedu.com.crt -out docker-client/harbor.oldboyedu.com.cert [root@harbor.oldboyedu.com certs]# [root@harbor.oldboyedu.com certs]# [root@harbor.oldboyedu.com certs]# pwd /oldboyedu/softwares/harbor/certs [root@harbor.oldboyedu.com certs]# [root@harbor.oldboyedu.com certs]# md5sum docker-client/harbor.oldboyedu.com.cert harbor-server/harbor.oldboyedu.com.crt 293b3c41ab85553e2da2d58d4c750868 docker-client/harbor.oldboyedu.com.cert 293b3c41ab85553e2da2d58d4c750868 harbor-server/harbor.oldboyedu.com.crt [root@harbor.oldboyedu.com certs]# 3.拷贝docker client证书文件 [root@harbor.oldboyedu.com certs]# cp harbor-server/harbor.oldboyedu.com.key docker-client/ [root@harbor.oldboyedu.com certs]# [root@harbor.oldboyedu.com certs]# cp ca/ca.crt docker-client/ [root@harbor.oldboyedu.com certs]# [root@harbor.oldboyedu.com certs]# ll -R .: total 20 drwxr-xr-x 5 root root 4096 Jul 29 07:15 ./ drwxr-xr-x 4 root root 4096 Jul 29 07:25 ../ drwxr-xr-x 2 root root 4096 Jul 29 07:17 ca/ drwxr-xr-x 2 root root 4096 Jul 29 07:37 docker-client/ drwxr-xr-x 2 root root 4096 Jul 29 07:21 harbor-server/ ./ca: total 16 drwxr-xr-x 2 root root 4096 Jul 29 07:17 ./ drwxr-xr-x 5 root root 4096 Jul 29 07:15 ../ -rw-r--r-- 1 root root 2049 Jul 29 07:17 ca.crt -rw------- 1 root root 3268 Jul 29 07:17 ca.key ./docker-client: total 20 drwxr-xr-x 2 root root 4096 Jul 29 07:37 ./ drwxr-xr-x 5 root root 4096 Jul 29 07:15 ../ -rw-r--r-- 1 root root 2049 Jul 29 07:37 ca.crt -rw-r--r-- 1 root root 2147 Jul 29 07:35 harbor.oldboyedu.com.cert -rw------- 1 root root 3272 Jul 29 07:36 harbor.oldboyedu.com.key ./harbor-server: total 24 drwxr-xr-x 2 root root 4096 Jul 29 07:21 ./ drwxr-xr-x 5 root root 4096 Jul 29 07:15 ../ -rw-r--r-- 1 root root 2147 Jul 29 07:21 harbor.oldboyedu.com.crt -rw-r--r-- 1 root root 1716 Jul 29 07:20 harbor.oldboyedu.com.csr -rw------- 1 root root 3272 Jul 29 07:19 harbor.oldboyedu.com.key -rw-r--r-- 1 root root 239 Jul 29 07:21 v3.ext [root@harbor.oldboyedu.com certs]# 4.docker客户端(k8s所有节点)使用证书 4.1 docker客户端创建自建证书的目录结构(注意域名的名称和目录要一致哟~) [root@master231 ~]# mkdir -pv /etc/docker/certs.d/harbor.oldboyedu.com/ mkdir: created directory '/etc/docker/certs.d' mkdir: created directory '/etc/docker/certs.d/harbor.oldboyedu.com/' [root@master231 ~]# [root@worker232 ~]# mkdir -pv /etc/docker/certs.d/harbor.oldboyedu.com/ mkdir: created directory '/etc/docker/certs.d' mkdir: created directory '/etc/docker/certs.d/harbor.oldboyedu.com/' [root@worker232 ~]# [root@worker233 ~]# mkdir -pv /etc/docker/certs.d/harbor.oldboyedu.com/ mkdir: created directory '/etc/docker/certs.d' mkdir: created directory '/etc/docker/certs.d/harbor.oldboyedu.com/' [root@worker233 ~]# 4.2 将客户端证书文件进行拷贝 [root@harbor.oldboyedu.com certs]# pwd /oldboyedu/softwares/harbor/certs [root@harbor.oldboyedu.com certs]# [root@harbor.oldboyedu.com certs]# scp docker-client/* 10.0.0.231:/etc/docker/certs.d/harbor.oldboyedu.com/ root@10.0.0.231's password: ca.crt 100% 2049 3.0MB/s 00:00 harbor.oldboyedu.com.cert 100% 2147 580.0KB/s 00:00 harbor.oldboyedu.com.key 100% 3272 1.2MB/s 00:00 [root@harbor.oldboyedu.com certs]# [root@harbor.oldboyedu.com certs]# scp docker-client/* 10.0.0.232:/etc/docker/certs.d/harbor.oldboyedu.com/ root@10.0.0.232's password: ca.crt 100% 2049 2.0MB/s 00:00 harbor.oldboyedu.com.cert 100% 2147 987.5KB/s 00:00 harbor.oldboyedu.com.key 100% 3272 2.2MB/s 00:00 [root@harbor.oldboyedu.com certs]# [root@harbor.oldboyedu.com certs]# scp docker-client/* 10.0.0.233:/etc/docker/certs.d/harbor.oldboyedu.com/ root@10.0.0.233's password: ca.crt 100% 2049 3.8MB/s 00:00 harbor.oldboyedu.com.cert 100% 2147 2.2MB/s 00:00 harbor.oldboyedu.com.key 100% 3272 2.4MB/s 00:00 [root@harbor.oldboyedu.com certs]# 4.3 docker客户端验证 [root@master231 ~]# docker login -u admin -p 1 harbor.oldboyedu.com WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded [root@master231 ~]# 报错提示: [root@master231 ~]# docker login -u admin -p 1 harbor.oldboyedu.com WARNING! Using --password via the CLI is insecure. Use --password-stdin. Error response from daemon: Get "https://harbor.oldboyedu.com/v2/": x509: certificate signed by unknown authority [root@master231 ~]# [root@worker232 ~]# docker login -u admin -p 1 harbor.oldboyedu.com WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded [root@worker232 ~]# [root@worker233 ~]# docker login -u admin -p 1 harbor.oldboyedu.com WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded [root@worker233 ~]# 问题分析: 为拷贝自建证书信息到docker 客户端指定目录。 解决方案: 参考“docker客户端(k8s所有节点)使用证书”内容即可。 参考链接: https://goharbor.io/docs/1.10/install-config/configure-https/#generate-a-certificate-authority-certificate https://www.cnblogs.com/yinzhengjie/p/17153673.html - K8S各节点环境准备 1 虚拟机操作系统环境准备 参考链接: https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ 2 关闭swap分区 swapoff -a && sysctl -w vm.swappiness=0 # 临时关闭 sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab # 基于配置文件关闭 3 确保各个节点MAC地址或product_uuid唯一 ifconfig ens33 | grep ether | awk '{print $2}' cat /sys/class/dmi/id/product_uuid 温馨提示: 一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。 4 检查网络节点是否互通 简而言之,就是检查你的k8s集群各节点是否互通,可以使用ping命令来测试。 ping baidu.com -c 10 ping master231 -c 10 5 允许iptable检查桥接流量 cat </etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF apt-get update 8.3 查看一下当前环境支持的k8s版本 [root@master231 ~]# apt-cache madison kubeadm kubeadm | 1.28.2-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages kubeadm | 1.28.1-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages kubeadm | 1.28.0-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages ... kubeadm | 1.23.17-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages kubeadm | 1.23.16-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages kubeadm | 1.23.15-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages kubeadm | 1.23.14-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages ... 8.4 安装 kubelet kubeadm kubectl apt-get -y install kubelet=1.23.17-00 kubeadm=1.23.17-00 kubectl=1.23.17-00 8.5 检查各组件版本 [root@worker232 ~]# kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.17", GitCommit:"953be8927218ec8067e1af2641e540238ffd7576", GitTreeState:"clean", BuildDate:"2023-02-22T13:33:14Z", GoVersion:"go1.19.6", Compiler:"gc", Platform:"linux/amd64"} [root@worker232 ~]# [root@worker232 ~]# kubectl version Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.17", GitCommit:"953be8927218ec8067e1af2641e540238ffd7576", GitTreeState:"clean", BuildDate:"2023-02-22T13:34:27Z", GoVersion:"go1.19.6", Compiler:"gc", Platform:"linux/amd64"} The connection to the server localhost:8080 was refused - did you specify the right host or port? [root@worker232 ~]# [root@worker232 ~]# kubelet --version Kubernetes v1.23.17 [root@worker232 ~]# 温馨提示: 其他两个节点都要检查下,避免你安装的版本和我不一致! 参考链接: https://kubernetes.io/zh/docs/tasks/tools/install-kubectl-linux/ 9.关机,拍快照 避免后续步骤出错时,方便回滚,因为后面的步骤很多同学容易做错。 - 基于kubeadm组件初始化K8S的master组件 0.温馨提示: svip: 你可以提前导入镜像。 [root@master231 ~]# wget http://192.168.16.253/Image/Docker/Kubernetes/K8S%20Cluster/oldboyedu-master-1.23.17.tar.gz [root@master231 ~]# docker load -i oldboyedu-master-1.23.17.tar.gz 1 使用kubeadm初始化master节点 [root@master231 ~]# kubeadm init --kubernetes-version=v1.23.17 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.100.0.0/16 --service-cidr=10.200.0.0/16 --service-dns-domain=oldboyedu.com ... mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 10.0.0.231:6443 --token mgznew.3ysh4jno08p0q4o5 \ --discovery-token-ca-cert-hash sha256:c919a67ea1d3ce32091ee7132a1dd1e20cee3442ef5a7e54e1e09779dcb4c4c4 [root@master231 ~]# 温馨提示: 你的token跟我不一致,请保存好,默认保留24小时,因此24小时内你的集群必须启动起来! 相关参数说明: --kubernetes-version: 指定K8S master组件的版本号。 --image-repository: 指定下载k8s master组件的镜像仓库地址。 --pod-network-cidr: 指定Pod的网段地址。 --service-cidr: 指定SVC的网段 --service-dns-domain: 指定service的域名。若不指定,默认为"cluster.local"。 使用kubeadm初始化集群时,可能会出现如下的输出信息: [init] 使用初始化的K8S版本。 [preflight] 主要是做安装K8S集群的前置工作,比如下载镜像,这个时间取决于你的网速。 [certs] 生成证书文件,默认存储在"/etc/kubernetes/pki"目录哟。 [kubeconfig] 生成K8S集群的默认配置文件,默认存储在"/etc/kubernetes"目录哟。 [kubelet-start] 启动kubelet, 环境变量默认写入:"/var/lib/kubelet/kubeadm-flags.env" 配置文件默认写入:"/var/lib/kubelet/config.yaml" [control-plane] 使用静态的目录,默认的资源清单存放在:"/etc/kubernetes/manifests"。 此过程会创建静态Pod,包括"kube-apiserver","kube-controller-manager"和"kube-scheduler" [etcd] 创建etcd的静态Pod,默认的资源清单存放在:""/etc/kubernetes/manifests" [wait-control-plane] 等待kubelet从资源清单目录"/etc/kubernetes/manifests"启动静态Pod。 [apiclient] 等待所有的master组件正常运行。 [upload-config] 创建名为"kubeadm-config"的ConfigMap在"kube-system"名称空间中。 [kubelet] 创建名为"kubelet-config-1.22"的ConfigMap在"kube-system"名称空间中,其中包含集群中kubelet的配置 [upload-certs] 跳过此节点,详情请参考”--upload-certs" [mark-control-plane] 标记控制面板,包括打标签和污点,目的是为了标记master节点。 [bootstrap-token] 创建token口令,例如:"kbkgsa.fc97518diw8bdqid"。 如下图所示,这个口令将来在加入集群节点时很有用,而且对于RBAC控制也很有用处哟。 [kubelet-finalize] 更新kubelet的证书文件信息 [addons] 添加附加组件,例如:"CoreDNS"和"kube-proxy” 2 拷贝授权文件,用于管理K8S集群 [root@master231 ~]# mkdir -p $HOME/.kube [root@master231 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master231 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config 3 查看集群节点 [root@master231 ~]# kubectl get cs Warning: v1 ComponentStatus is deprecated in v1.19+ NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true","reason":""} [root@master231 ~]# [root@master231 ~]# [root@master231 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master231 NotReady control-plane,master 117s v1.23.17 [root@master231 ~]# - 基于kubeadm部署worker组件 0.svip可以提前导入镜像 [root@worker232 ~]# wget http://192.168.16.253/Image/Docker/Kubernetes/K8S%20Cluster/oldboyedu-slave-1.23.17.tar.gz [root@worker233 ~]# wget http://192.168.16.253/Image/Docker/Kubernetes/K8S%20Cluster/oldboyedu-slave-1.23.17.tar.gz [root@worker232 ~]# docker load -i oldboyedu-slave-1.23.17.tar.gz [root@worker233 ~]# docker load -i oldboyedu-slave-1.23.17.tar.gz 1.在worker节点执行加入的命令【注意!!!!!!不要复制我的,照着我的做不出来,复制你自己的token】 [root@worker232 ~]# kubeadm join 10.0.0.231:6443 --token mgznew.3ysh4jno08p0q4o5 \ --discovery-token-ca-cert-hash sha256:c919a67ea1d3ce32091ee7132a1dd1e20cee3442ef5a7e54e1e09779dcb4c4c4 [root@worker233 ~]# kubeadm join 10.0.0.231:6443 --token mgznew.3ysh4jno08p0q4o5 \ --discovery-token-ca-cert-hash sha256:c919a67ea1d3ce32091ee7132a1dd1e20cee3442ef5a7e54e1e09779dcb4c4c4 温馨提示: 上面的命令表示将worker节点加入到k8s的master初始化的集群。使用你上一步生成的token即可。 2.master节点检查集群的worker节点列表 [root@master231 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master231 NotReady control-plane,master 13m v1.23.17 worker232 NotReady 3m19s v1.23.17 worker233 NotReady 2m3s v1.23.17 [root@master231 ~]# [root@master231 ~]# 温馨提示: 此时K8S组件就算部署成功了,但是将来容器的网络依旧没有准备就绪,因此各节点处于“NotReady”状态。 - 部署CNI插件并验证Pod网络连通性 1.所有节点手动导入镜像 由于docker官网无法直接访问,因此虚拟机需要翻墙。 如果无法翻墙的小伙伴可以手动导入镜像,K8S所有节点操作如下 : [root@master231 ~]# wget http://192.168.16.253/Image/Docker/Kubernetes/K8S%20Cluster/oldboyedu-flannel-cni-plugin-v1.5.1.tar.gz [root@master231 ~]# docker load -i oldboyedu-flannel-cni-plugin-v1.5.1.tar.gz [root@worker232 ~]# wget http://192.168.16.253/Image/Docker/Kubernetes/K8S%20Cluster/oldboyedu-flannel-cni-plugin-v1.5.1.tar.gz [root@worker232 ~]# docker load -i oldboyedu-flannel-cni-plugin-v1.5.1.tar.gz [root@worker233 ~]# wget http://192.168.16.253/Image/Docker/Kubernetes/K8S%20Cluster/oldboyedu-flannel-cni-plugin-v1.5.1.tar.gz [root@worker233 ~]# docker load -i oldboyedu-flannel-cni-plugin-v1.5.1.tar.gz 2.下载Flannel组件 [root@master231 ~]# wget http://192.168.16.253/Linux92/Kubernetes/day15-/softwares/kube-flannel.yml 3.安装Flannel组件 [root@master231 ~]# kubectl apply -f kube-flannel.yml namespace/kube-flannel created serviceaccount/flannel created clusterrole.rbac.authorization.k8s.io/flannel created clusterrolebinding.rbac.authorization.k8s.io/flannel created configmap/kube-flannel-cfg created daemonset.apps/kube-flannel-ds created [root@master231 ~]# 4.检查falnnel各组件是否安装成功 [root@master231 ~]# kubectl get pods -o wide -n kube-flannel NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-flannel-ds-ckkbk 1/1 Running 0 35s 10.0.0.233 worker233 kube-flannel-ds-kst7g 1/1 Running 0 35s 10.0.0.232 worker232 kube-flannel-ds-ljktm 1/1 Running 0 35s 10.0.0.231 master231 [root@master231 ~]# 5.测试各节点组件 [root@master231 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master231 Ready control-plane,master 37m v1.23.17 worker232 Ready 27m v1.23.17 worker233 Ready 26m v1.23.17 [root@master231 ~]# 6.验证Pod的CNI网络是否正常 [root@master231 ~]# cat oldboyedu-network-cni.yaml apiVersion: v1 kind: Pod metadata: name: xiuxian-v1 spec: nodeName: worker232 containers: - image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 name: xiuxian --- apiVersion: v1 kind: Pod metadata: name: xiuxian-v2 spec: nodeName: worker233 containers: - image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2 name: xiuxian [root@master231 ~]# [root@master231 ~]# kubectl apply -f oldboyedu-network-cni.yaml pod/xiuxian-v1 created pod/xiuxian-v2 created [root@master231 ~]# [root@master231 ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES xiuxian-v1 1/1 Running 0 6s 10.100.1.3 worker232 xiuxian-v2 1/1 Running 0 6s 10.100.2.3 worker233 [root@master231 ~]# [root@master231 ~]# curl 10.100.1.3 yinzhengjie apps v1

凡人修仙传 v1

[root@master231 ~]# [root@master231 ~]# curl 10.100.2.3 yinzhengjie apps v2

凡人修仙传 v2

[root@master231 ~]# [root@master231 ~]# kubectl delete -f oldboyedu-network-cni.yaml pod "xiuxian-v1" deleted pod "xiuxian-v2" deleted [root@master231 ~]# [root@master231 ~]# kubectl get pods No resources found in default namespace. [root@master231 ~]# - kubectl工具实现自动补全功能 1.添加环境变量 [root@master231 ~]# kubectl completion bash > ~/.kube/completion.bash.inc [root@master231 ~]# [root@master231 ~]# echo source '$HOME/.kube/completion.bash.inc' >> ~/.bashrc [root@master231 ~]# [root@master231 ~]# source ~/.bashrc [root@master231 ~]# 2.验证自动补全功能 [root@master231 ~]# kubectl # 连续按2次tab键测试能否出现命令 alpha auth cordon diff get patch run version annotate autoscale cp drain help plugin scale wait api-resources certificate create edit kustomize port-forward set api-versions cluster-info debug exec label proxy taint apply completion delete explain logs replace top attach config describe expose options rollout uncordon [root@master231 ~]# - K8S集群时区设置 1.修改时区 [root@master231 ~]# ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime '/etc/localtime' -> '/usr/share/zoneinfo/Asia/Shanghai' [root@master231 ~]# [root@worker233 ~]# ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime '/etc/localtime' -> '/usr/share/zoneinfo/Asia/Shanghai' [root@worker233 ~]# [root@worker232 ~]# ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime '/etc/localtime' -> '/usr/share/zoneinfo/Asia/Shanghai' [root@worker232 ~]# 2.验证 [root@master231 ~]# date -R Mon, 29 Jul 2024 17:27:02 +0800 [root@master231 ~]# [root@worker233 ~]# date -R Mon, 29 Jul 2024 17:27:32 +0800 [root@worker233 ~]# [root@worker232 ~]# date -R Mon, 29 Jul 2024 17:27:51 +0800 [root@worker232 ~]# - 集群快照拍摄并测试验证K8S可用性 1.关机拍快照。 略 2.验证自动补全功能是否正常 [root@master231 ~]# kubectl alpha auth cordon diff get patch run version annotate autoscale cp drain help plugin scale wait api-resources certificate create edit kustomize port-forward set api-versions cluster-info debug exec label proxy taint apply completion delete explain logs replace top attach config describe expose options rollout uncordon [root@master231 ~]# 3.验证节点是否正常 [root@master231 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master231 Ready control-plane,master 52m v1.23.17 worker232 Ready 42m v1.23.17 worker233 Ready 41m v1.23.17 [root@master231 ~]# 4.检查CNI组件是否有问题 [root@master231 ~]# kubectl get pods -n kube-flannel -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-flannel-ds-ckkbk 1/1 Running 1 (76s ago) 19m 10.0.0.233 worker233 kube-flannel-ds-kst7g 1/1 Running 1 (114s ago) 19m 10.0.0.232 worker232 kube-flannel-ds-ljktm 1/1 Running 1 (2m1s ago) 19m 10.0.0.231 master231 [root@master231 ~]# 5.验证网络是否正常 [root@master231 ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES xiuxian-v1 1/1 Running 0 4s 10.100.1.4 worker232 xiuxian-v2 1/1 Running 0 3s 10.100.2.4 worker233 [root@master231 ~]# [root@master231 ~]# curl 10.100.1.4 yinzhengjie apps v1

凡人修仙传 v1

[root@master231 ~]# [root@master231 ~]# curl 10.100.2.4 yinzhengjie apps v2

凡人修仙传 v2

[root@master231 ~]# - 今日内容回顾: - K8S部署方式: 官方: kubeadm 二进制 其他方式: 云平台: ACK TKE CCE 开源产品: kuborad kubesphere rancher minikube kind - K8S架构 master: control-plane - etcd - api-server - scheduler - controller manager slave : worker node - kubelet - kube-proxy CNI: Flannel - 二进制和kubeadm的部署方式对比 - 基于自建证书部署harbor的https案例 - kubeadm搭建K8S集群 - k8s各节点环境准备 - 部署master组件 - 部署worker组件 - 部署CNI组件 - 验证集群 - 自动补全 - 时区设置 今日作业: - 完成课堂的所有练习并整理思维导图 扩展作业: 将k8s 1.23.17关于ubunut的软件包保留到本地并制作ubuntu的原件源进行部署。