[云原生专题-26]:K8S - Kubernetes(K8S)Master集群构建与安装过程详细解读 - master节点的添加

网友投稿 246 2022-10-21

[云原生专题-26]:K8S - Kubernetes(K8S)Master集群构建与安装过程详细解读 - master节点的添加

作者主页(​​文火冰糖的硅基工坊​​​):​​文火冰糖(王文兵)的博客_文火冰糖的硅基工坊​

​目录​

​​第一步:集群规划​​

​​1.1 K8S的官方架构​​

​​1.2 K8S的实验架构​​

​​1.3 主要步骤​​

​​1.4 K8S集群搭建方式选择​​

​​1.5 官方参考​​

​​第二步:搭建云服务器​​

​​2.1 安装服务器​​

​​2.2 安装后检查​​

​​第三步:搭建Docker环境(云平台手工操作)​​

​​3.1  为每台虚拟服务器安装docker环境​​

​​3.2 为每台虚拟服务器启动docker环境​​

​​3.3 为K8S修改 docker配置​​

​​第四步:K8前的安装前的准备​​

​​4.1 关闭防火墙​​

​​4.2 关闭swap​​

​​4.3 设置内网静态IP地址(可选)​​

​​4.4 配置IPtable-流量桥接​​

​​第五步:搭建集群K8S mananger节点​​

​​5.1 增加K8S repo: kubernetes.repo​​

​​5.2 安装kubeadm、kubelet​​

​​5.3 搭建mananger角色  (join as mananger)​​

​​5.4 增加K8S配置 :$HOME/.kube/config​​

​​5.5 查看集群的节点情况​​

​​附录:其他命令​​

第一步:集群规划

1.1 K8S的官方架构

1.2 K8S的实验架构

构建2个mananger节点 + 3  worker节点的集群网络。

1.3 主要步骤

​第一步:​安装初始mananger节点

​第二步:​安装worker节点(本章)

​第三步:​安装其他mananger节点

​第四步:​图形化管理界面Dash Board的安装

1.4 K8S集群搭建方式选择

​方式1:minikube​

minikube可以在本地运行Kubernetes的工具,minikube可以在个人计算机(包括Windows,macOS和Linux PC)上运行一个单节点Kubernetes集群,以便您可以试用Kubernetes或进行日常开发工作;

​​Hello Minikube | Kubernetes​​

​方式2:kind​

Kind和minikube类似的工具,让你在本地计算机上运行Kubernetes,此工具需要安装并配置Docker;

​方式3:kubeadm​

Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;

​本文选择第三种方式 ​

kubeadm是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署;

​(1)创建一个Mananger leader节点​

$ kubeadm init

​(2)将Node节点加入到Master集群中​

$ kubeadm join

因此需要在Mananger节点和worker节点都需要安装。

​方式4:二进制包​

从Github下载发行版的二进制包,手动部署安装每个组件,组成Kubernetes集群,步骤比较繁琐,但是能让你对各个组件有更清晰的认识;

​方式5:yum安装​

通过yum安装Kubernetes的每个组件,组成Kubernetes集群,不过yum源里面的k8s版本已经比较老了,所以这种方式用得也比较少了;

​方式6:第三方工具​

有一些大神封装了一些工具,利用这些工具进行k8s环境的安装;

​方式7:花钱购买​

直接购买类似阿里云这样的k8s公有云平台,一键搞定;

1.5 官方参考

​​Kubeadm | Kubernetes​​

​​Installing kubeadm | Kubernetes​​

​第二步:搭建云服务器​

​2.1 安装服务器​

​(1)服务器​

创建1台服务器 (也可以一次性创建5台服务器,两mananger节点,3个worker节点)所有服务器在同一个默认网络中CPU: 2核4G (Master节点至少2个CPU)标准共享型(偏移)操作系统:Alibaba Cloud Linux (完全兼容CentOS, 不建议安装CentOS, 因为CentOS官方已经得不到支持了,无法支持新的功能)

​(2)网络​

分配公有IP地址默认专有网络按流量使用,1M带宽

​(3)默认安全组​

设定公网远程服务服务器的用户名和密码添加80和8080端口,用于后续nginx服务的测试。

2.2 安装后检查

​(1)通过公网IP登录到每台服务器​

​(2) 为服务器划分角色​:initial mananger

公网IP地址:121.40.221.28

私网IP地址:172.24.130.175

​(3)修改主机名​

修改主机名的目的是为了后续可以通过主机名来访问主机,而不是通过IP地址。

当然,如果需要通过主机名访问,还需要修改配置,实现主机名与IP地址的映射。

hostnamectl set-hostname k8s-master2

​(4)建立主机名与IP地址的映射表,以便通过主机名访问主机​

$ vim /etc/hosts

172.24.130.172 k8s-master1172.24.130.172 etcd172.24.130.172 registry172.24.130.172 cluster-endpoint172.24.130.175 k8s-master2

​(5)安装ifconfig和ping工具(针对没有ping工具的主机)​

$ yum install -y yum-utils$ yum install iputils$ yum install net-tools.x86_64

​(6)通过私网IP可以ping通​

ping k8s-master1ping k8s-node1ping cluster-endpoint

​第三步:搭建Docker环境(云平台手工操作)​

​​CentOS Docker 安装 | 菜鸟教程​​

​​How nodes work | Docker Documentation​​

​3.1  为每台虚拟服务器安装docker环境​

​(1)ssh到虚拟服务器中​

​(2)一键安装docker环境​

yum-config-manager命令是仓​库​(/etc/yum.repos.d/下的文件)进行增删改查

系统默认没有安装这个命令,这个命令在yum-utils包里,可以通过yum install -y yum-utils安装.

yum repolist all # 显示所有资源库yum repolist enabled # 显示所有已启动的资源库yum repolist disabled # 显示所有被禁用的资源库

# 增加阿里云镜像repo$ yum-config-manager --add-repo 清华镜像$ yum-config-manager --add-repo 官方镜像$ yum-config-manager --add-repo 卸载$ yum remove docker-ce$ rm -rf /var/lib/docker# 非一键安装最新版本yum install docker-ce docker-ce-cli containerd.io# 非一键安装指定版本# 通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),# 从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。# 例如:docker-ce-18.09.1。yum install docker-ce- docker-ce-cli- containerd.io

​3.2 为每台虚拟服务器启动docker环境​

$ systemctl start docker$ docker version$ docker ps$ docker images$ docker info

3.3 为K8S修改 docker配置

$ touch /etc/docker/daemon.json$ vim /etc/docker/daemon.json>>{ "registry-mirrors": [" "exec-opts": ["native.cgroupdriver=systemd"]}

其中"exec-opts": ["native.cgroupdriver=systemd"]是K8S所需要的。

限定K8S的程序,以systemd的方式在后台运行。

# 重启docker$ systemctl daemon-reload$ systemctl restart docker

第四步:K8前的安装前的准备

4.1 关闭防火墙

之所以要关闭防火墙,是因为集群内的机器需要通过私网进行通信,如果不关闭防火墙,可能会导致集群内机器通信失败,出现K8S安装失败时,定位问题困难。

$ 临时禁用$ systemctl stop firewalld$ systemctl disable firewalld# setenforce是Linux的selinux防火墙配置命令, 执行setenforce 0 表示关闭selinux防火墙)$ setenforce 0# 永久禁用$ vim /etc/selinux/configSELINUX=disabled

iptables防火墙,会对所有网络流量进行过滤、转发,如果是内网机器一般都会直接关闭,省的影响网络性能,但k8s不能直接关了,k8s是需要用防火墙做ip转发和修改的,当然也看使用的网络模式,如果采用的网络模式不需要防火墙也是可以直接关闭的。

4.2 关闭swap

交换分区,英文的说法是swap,意思是“交换”、“实物交易”。它的功能就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行,和Windows的虚拟内存(pagefile.sys)的作用是一样的。

将部分内存数据存放到磁盘中,这个这样会使性能下降,为了性能考虑推荐关掉,增加内存。

# 临时关闭$ swapoff -a# 永久关闭$ vim /etc/fstab>>#/dev/mapper/centos-swap swap swap defaults 0 0# 使用free -m确认swap已经关闭。swap部分为0$ free -m

4.3 设置内网静态IP地址(可选)

(1)ipconfig查看网卡名称

(2)vim /etc/sysconfig/network-scripts/ifcfg-网卡名称

根据自己系统的实际情况修改IP地址。

master配置:BOOTPROTO="static" # IPADDR="172.24.130.170" # IPNETMASK="255.255.248.0" # mask#GATEWAY="172.24.130.1" # 网关地址(使用route -n 第一行就是默认的网关)#DNS1="8.8.8.8" # DNS服务器 (cat /etc/resolv.conf 查看)

4.4 配置IPtable-流量桥接

​方法1(推荐)​

$ cd /etc/sysctl.d$ touch k8s.conf$ vim k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1vm.swappiness=0# 使得配置文件生效$ modprobe br_netfilter$ sysctl --system -p /etc/sysctl.d/k8s.conf

​方法2:​

对于 RHEL/CentOS 7 系统,可以会由于 iptables 被绕过导致网络请求被错误的路由。所以还需执行如下命令保证 sysctl 配置中 net.bridge.bridge-nf-call-iptables 被设为1。

$ vi /etc/sysctl.conf# 添加如下内容net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1$ sysctl --system

第五步:搭建集群K8S mananger节点

在每台work节点上安装 docker kubelet kubeadm等

kubectl操作集群,只需要配置master即可。

# 如果初始化过程出现问题,使用如下命令重置$ kubeadm reset$ rm -rf /var/lib/cni/$ rm -f $HOME/.kube/config$ systemctl daemon-reload && systemctl restart kubelet

​5.1 增加K8S repo: kubernetes.repo​

$ cat < /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=/etc/yum.repos.d/kubernetes.repo

5.2 安装​kubeadm、kubelet​

[root@iZbp16ikro46xndxi7u9pjZ sysctl.d]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE[root@iZbp16ikro46xndxi7u9pjZ sysctl.d]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

$ yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes $ systemctl enable kubelet && systemctl start kubelet

kubeadm:用来初始化集群(Cluster)kubelet:安装在需要部署pod和 容器的节点上,可以包括mananger节点。kubectl:这个是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。

5.3 搭建mananger角色  (join as mananger)

​(1)获取initial master节点的token​

​在leader mananger节点上执行如下命令​

# 在master上面查看kubeadm token$ kubeadm token listTOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS6bq3xf.k2mdmcnitcud9hz2 1h 2022-02-04T16:10:01Z authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-tokenjx01gc.ubt8nijtf0s059r8 12h 2022-02-05T02:47:48Z authentication,signing system:bootstrappers:kubeadm:default-node-tokenx436pa.ueo5bql4xvl3o5xx 12h 2022-02-05T02:32:40Z authentication,signing system:bootstrappers:kubeadm:default-node-token# 如果执行kubeadm token list没有结果,说明token过期了# 默认情况下,kubeadm生成的token只有24小时有效期,过了时间需要创建一个新的$ kubeadm token create# 也可以生成一个永不过期的token,当然这是有安全隐患的$ kubeadm token create --ttl 0

​(2)获取master节点连接的证书​

​在master节点执行如下命令:​

# 在master上面查看discovery-token-ca-cert-hash$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'dfef78a1d7faf2411c0e5f5389cf39a73e27dc0afbea4cb0ab0a6945763c415e

​(3)直接按照一下的命令生成加入集群的命令​

[root@k8s-master1 ~]# kubeadm token create --print-join-command kubeadm join cluster-endpoint:6443 --token rml99d.0xpplmg1n6aiwg4h --discovery-token-ca-cert-hash sha256:dfef78a1d7faf2411c0e5f5389cf39a73e27dc0afbea4cb0ab0a6945763c415e [root@k8s-master1 ~]#

​(4)关键:获取control-plane证书(以manager节点加入方式才需要此步骤)​

[root@k8s-master1 ~]# kubeadm init phase upload-certs --upload-certs[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace[upload-certs] Using certificate key:d6012d2739f3f6198653ed6ea726e826e93a80a26ab75c1c6068dcb24791176d

​(5)以mananger的身份加入集群​

​在每个mananger机器分别执行如下命令:​

区别于普通节点:

--control-plane --certificate-key d6012d2739f3f6198653ed6ea726e826e93a80a26ab75c1c6068dcb24791176d

# 在node上面执行join命令kubeadm join cluster-endpoint:6443 --token rml99d.0xpplmg1n6aiwg4h --discovery-token-ca-cert-hash sha256:dfef78a1d7faf2411c0e5f5389cf39a73e27dc0afbea4cb0ab0a6945763c415e --control-plane --certificate-key d6012d2739f3f6198653ed6ea726e826e93a80a26ab75c1c6068dcb24791176d

This node has joined the cluster and a new control plane instance was created:

* Certificate signing request was sent to apiserver and approval was received.

* The Kubelet was informed of the new secure connection details.

* Control plane (master) label and taint were applied to the new node.

* The Kubernetes control plane instances scaled up.

* A new etcd member was added to the local/stacked etcd cluster.

To start administering your cluster from this node, you need to run the following as a regular user:

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

Run 'kubectl get nodes' to see this node join the cluster.

​5.4 增加K8S配置 :​$HOME/.kube/config

(1) 方法1:文件传送# 在master上,将master中的admin.conf 拷贝到node中,这里是scp的方式,使用客户端手动上传也是可以的$ scp /etc/kubernetes/admin.conf root@10.11.90.5:/root/$ sudo cp -i /root/admin.conf /root/.kube/config(2)方法2:文件内容拷贝# 在mananger上:$ cat /root/.kube/config# 在node上$ mkdir -p /root/.kube# touch /root/.kube/config# vi /root/.kube/config# paste(3)公共部分$ sudo chown $(id -u):$(id -g) /root/.kube/config

​5.5 查看集群的节点情况​

​(1)在master2机器查看按照的docker 镜像​

[root@k8s-master2 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcalico/cni v3.22.0 f86797de8afd 6 days ago 235MBcalico/pod2daemon-flexvol v3.22.0 59daef946c8c 6 days ago 21.4MBcalico/node v3.22.0 f109b1742d34 6 days ago 213MBregistry.aliyuncs.com/google_containers/kube-apiserver v1.23.3 f40be0088a83 10 days ago 135MBregistry.aliyuncs.com/google_containers/kube-controller-manager v1.23.3 b07520cd7ab7 10 days ago 125MBregistry.aliyuncs.com/google_containers/kube-scheduler v1.23.3 99a3486be4f2 10 days ago 53.5MBregistry.aliyuncs.com/google_containers/kube-proxy v1.23.3 9b7cc9982109 10 days ago 112MBregistry.aliyuncs.com/google_containers/etcd 3.5.1-0 25f8c7f3da61 3 months ago 293MBregistry.aliyuncs.com/google_containers/coredns v1.8.6 a4ca41631cc7 4 months ago 46.8MBregistry.aliyuncs.com/google_containers/pause 3.6 6270bb605e12 5

这里的关键镜像有:

kube-apiserverkube-controller-managerkube-schedulerkube-proxyetcdcoredns

备注:

kubelet、kubectl、kubeadm并不是以docker镜像的形式存在的。

​(2)在master2机器上查看运行的docker镜像​

[root@k8s-master2 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9ffe2142cf67 25f8c7f3da61 "etcd --advertise-cl鈥 11 minutes ago Up 11 minutes k8s_etcd_etcd-k8s-master2_kube-system_706d75dbed33b74a9eb2a257c70ec8ca_0bc94135d6e4e registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 11 minutes ago Up 11 minutes k8s_POD_etcd-k8s-master2_kube-system_706d75dbed33b74a9eb2a257c70ec8ca_0de65344e432f f109b1742d34 "start_runit" 11 minutes ago Up 11 minutes k8s_calico-node_calico-node-788s9_kube-system_5f47e93c-d7ba-4f03-8492-16789ad63f5f_0884909eda425 9b7cc9982109 "/usr/local/bin/kube鈥 11 minutes ago Up 11 minutes k8s_kube-proxy_kube-proxy-lzk68_kube-system_d7c77067-caf7-49ac-b583-0bfc1f78a570_08254ff287759 registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 11 minutes ago Up 11 minutes k8s_POD_calico-node-788s9_kube-system_5f47e93c-d7ba-4f03-8492-16789ad63f5f_0f30d014de71d registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 11 minutes ago Up 11 minutes k8s_POD_kube-proxy-lzk68_kube-system_d7c77067-caf7-49ac-b583-0bfc1f78a570_05707a12084b6 99a3486be4f2 "kube-scheduler --au鈥 11 minutes ago Up 11 minutes k8s_kube-scheduler_kube-scheduler-k8s-master2_kube-system_5808d7a2cc75abb3c980285a10a583a2_0711fc3bb1684 registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 11 minutes ago Up 11 minutes k8s_POD_kube-scheduler-k8s-master2_kube-system_5808d7a2cc75abb3c980285a10a583a2_06494d274ee5a b07520cd7ab7 "kube-controller-man鈥 11 minutes ago Up 11 minutes k8s_kube-controller-manager_kube-controller-manager-k8s-master2_kube-system_f15dd52d7c99023d31ae7ecc988f1839_0a81a458e22f8 f40be0088a83 "kube-apiserver --ad鈥 11 minutes ago Up 11 minutes k8s_kube-apiserver_kube-apiserver-k8s-master2_kube-system_b6cd24ae8b5e810ea00d42fbebf0786c_08a3ef16155f3 registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 11 minutes ago Up 11 minutes k8s_POD_kube-controller-manager-k8s-master2_kube-system_f15dd52d7c99023d31ae7ecc988f1839_0fef2527a8849 registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 11 minutes ago Up 11 minutes k8s_POD_kube-apiserver-k8s-master2_kube-system_b6cd24ae8b5e810ea00d42fbebf0786c_0[root@k8s-master2 ~]#

这里的关键镜像有:

kube-apiserverkube-controller-managerkube-schedulerkube-proxyetcdcoredns

​(3)在master节点参看集群节点​

[root@k8s-master1 ~]# kubectl get nodesNAME STATUS ROLES AGE VERSIONk8s-master1 Ready control-plane,master 34h v1.23.3k8s-master2 Ready control-plane,master 26s v1.23.3k8s-node1 NotReady 23h v1.23.3k8s-node2 NotReady 12h v1.23.3

k8s-master1   Ready      control-plane,master   34h   v1.23.3

k8s-master2   Ready      control-plane,master   26s   v1.23.3

# 查看集群中的服务$ kubectl get pods -A[root@k8s-master1 ~]# kubectl get pods -ANAMESPACE NAME READY STATUS RESTARTS AGEkube-system calico-kube-controllers-566dc76669-2pkhv 1/1 Running 3 (11h ago) 34hkube-system calico-node-788s9 1/1 Running 0 12mkube-system calico-node-cc8sp 1/1 Running 3 (11h ago) 34hkube-system calico-node-sp6kl 1/1 Running 1 (22h ago) 23hkube-system calico-node-z4bt5 1/1 Running 0 12hkube-system coredns-6d8c4cb4d-mcjv8 1/1 Running 3 (11h ago) 34hkube-system coredns-6d8c4cb4d-rxjh9 1/1 Running 3 (11h ago) 34hkube-system etcd-k8s-master1 1/1 Running 8 (11h ago) 34hkube-system etcd-k8s-master2 1/1 Running 0 12mkube-system kube-apiserver-k8s-master1 1/1 Running 7 (11h ago) 34hkube-system kube-apiserver-k8s-master2 1/1 Running 0 12mkube-system kube-controller-manager-k8s-master1 1/1 Running 6 (12m ago) 34hkube-system kube-controller-manager-k8s-master2 1/1 Running 0 12mkube-system kube-proxy-9z2bm 1/1 Running 3 (11h ago) 34hkube-system kube-proxy-k8q7w 1/1 Running 0 12hkube-system kube-proxy-lzk68 1/1 Running 0 12mkube-system kube-proxy-vh5hc 1/1 Running 1 (22h ago) 23hkube-system kube-scheduler-k8s-master1 1/1 Running 8 (12m ago) 34hkube-system kube-scheduler-k8s-master2 1/1 Running 0 12mkubernetes-dashboard dashboard-metrics-scraper-799d786dbf-dkm47 1/1 Running 2 (11h ago) 34hkubernetes-dashboard kubernetes-dashboard-546cbc58cd-c55gt 1/1 Running 2 (11h ago) 34h# 周期性查看$ watch -n 1 kubectl get pods -A

附录:其他命令

# 删除一个节点:$ kubectl delete node k8s-master2 # 如果初始化过程出现问题,使用如下命令重置$ kubeadm reset$ rm -rf /var/lib/cni/$ rm -f $HOME/.kube/config$ systemctl daemon-reload && systemctl restart kubelet

作者主页(​​文火冰糖的硅基工坊​​​):​​文火冰糖(王文兵)的博客_文火冰糖的硅基工坊​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java的Comparable,Comparator和Cloneable三大接口详解
下一篇:[云原生专题-52]:Kubesphere云治理-操作-分步部署基于微服务的业务应用 - 搜索中间件Elasticsearch微服务部署过程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~