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

Posted 文火冰糖的硅基工坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[云原生专题-25]:K8S - Kubernetes(K8S)Master集群构建与安装过程详细解读 - worker节点的安装与加入相关的知识,希望对你有一定的参考价值。

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

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122785801


目录

第一步:集群规划

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 work节点

5.1 增加K8S repo: kubernetes.repo

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

5.3 安装kubeadm、kubelet

5.3 搭建worker 角色  (join as worker)

5.4 查看集群的节点情况

第六章 退群与重新入群

6.1 在mananger节点退出

6.2 在node节点重新加入



第一步:集群规划

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 <Master节点的IP和端口>

因此需要在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: 1核2G or 2核4G
  • 标准共享型(偏移)
  • 操作系统:Alibaba Cloud Linux (完全兼容CentOS, 不建议安装CentOS, 因为CentOS官方已经得不到支持了,无法支持新的功能)

(2)网络

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

(3)默认安全组

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

​​

​​

2.2 安装后检查

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

 ​​

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

公网IP地址:47.96.137.180/118.31.171.220

私网IP地址:172.24.130.173/172.24.130.174

(3)修改主机名

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

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

hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2

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

$ vim /etc/hosts
172.24.130.172 k8s-master1

172.24.130.172 etcd
172.24.130.172 registry
172.24.130.172 cluster-endpoint

172.24.130.173 k8s-node1
172.24.130.174 k8s-node2

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

$ yum install -y yum-utils

$ yum install iputils

$ yum install net-tools.x86_64

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

ping k8s-master1
ping k8s-node1
ping 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 http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 清华镜像
$ yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

# 官方镜像
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

(3)手工非一键安装

# 卸载
$ 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-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> 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": ["https://obww7jh1.mirror.aliyuncs.com"],
  "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/config
SELINUX=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" # IP
NETMASK="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 /etc/sysctl.d/k8s.conf
$ vim   /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.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 = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

$ sysctl --system

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

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

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

5.1 增加K8S repo: kubernetes.repo

$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

 

cat /etc/yum.repos.d/kubernetes.repo

5.2 增加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
# paste

(3)公共部分
$ sudo chown $(id -u):$(id -g) /root/.kube/config

5.3 安装kubeadm、kubelet

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

5.3 搭建worker 角色  (join as worker)

(1)获取master节点的token

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

# 在master上面查看kubeadm token
$ kubeadm token list

TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
6bq3xf.k2mdmcnitcud9hz2   1h          2022-02-04T16:10:01Z   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token
jx01gc.ubt8nijtf0s059r8   12h         2022-02-05T02:47:48Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
x436pa.ueo5bql4xvl3o5xx   12h         2022-02-05T02:32:40Z   authentication,signing   <none>                                                     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)或者以下面的方式直接活动加入节点的命令

kubeadm token create --print-join-command 

kubeadm join cluster-endpoint:6443 --token rml99d.0xpplmg1n6aiwg4h --discovery-token-ca-cert-hash sha256:dfef78a1d7faf2411c0e5f5389cf39a73e27dc0afbea4cb0ab0a6945763c415e 

(4)以worker的身份加入集群

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

# 在node上面执行join命令
$ kubeadm join 172.24.130.172:6443 --token x436pa.ueo5bql4xvl3o5xx --discovery-token-ca-cert-hash sha256:dfef78a1d7faf2411c0e5f5389cf39a73e27dc0afbea4cb0ab0a6945763c415e

kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

5.4 查看集群的节点情况

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

[root@k8s-node2 ~]# docker images
REPOSITORY                                           TAG       IMAGE ID       CREATED        SIZE
calico/cni                                           v3.22.0   f86797de8afd   5 days ago     235MB
registry.aliyuncs.com/google_containers/kube-proxy   v1.23.3   9b7cc9982109   9 days ago     112MB
registry.aliyuncs.com/google_containers/pause        3.6       6270bb605e12   5 months ago   683kB

这里的关键镜像有:

  • calico
  • kube-proxy

备注:

  • kubelet和kubeadm并不是以docker镜像的形式存在的。
  • work节点可以不用安装kubectl,但需要安装kubeadm

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

[root@k8s-node2 ~]#  docker ps
CONTAINER ID   IMAGE                                                COMMAND                  CREATED              STATUS              PORTS     NAMES
df3a832bcc32   registry.aliyuncs.com/google_containers/kube-proxy   "/usr/local/bin/kube鈥   42 seconds ago       Up 41 seconds                 k8s_kube-proxy_kube-proxy-k8q7w_kube-system_086769fe-c788-4188-b57a-8774be243686_0
b5798ec0b2e3   registry.aliyuncs.com/google_containers/pause:3.6    "/pause"                 About a minute ago   Up About a minute             k8s_POD_kube-proxy-k8q7w_kube-system_086769fe-c788-4188-b57a-8774be243686_0
45f211afedeb   registry.aliyuncs.com/google_containers/pause:3.6    "/pause"                 About a minute ago   Up About a minute             k8s_POD_calico-node-z4bt5_kube-system_d3610974-8b7b-4658-8aea-8a5e4f4a75cc_0
[root@k8s-node2 ~]# 

这里的关键镜像有:

  • calico
  • kube-proxy

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

# 查看集群中的节点
root@k8s-node2 ~]# kubectl get nodes
NAME          STATUS   ROLES                  AGE     VERSION
k8s-master1   Ready    control-plane,master   22h     v1.23.3
k8s-node1     Ready    <none>                 11h     v1.23.3
k8s-node2     Ready    <none>                 2m50s   v1.23.3


# 查看集群中的服务
$ kubectl get pods -A
[root@k8s-node2 ~]# kubectl get pods -A
NAMESPACE              NAME                                         READY   STATUS    RESTARTS      AGE
kube-system            calico-kube-controllers-566dc76669-2pkhv     1/1     Running   2 (10h ago)   22h
kube-system            calico-node-cc8sp                            1/1     Running   2 (10h ago)   22h
kube-system            calico-node-sp6kl                            1/1     Running   1 (10h ago)   11h
kube-system            calico-node-z4bt5                            1/1     Running   0             3m21s
kube-system            coredns-6d8c4cb4d-mcjv8                      1/1     Running   2 (10h ago)   22h
kube-system            coredns-6d8c4cb4d-rxjh9                      1/1     Running   2 (10h ago)   22h
kube-system            etcd-k8s-master1                             1/1     Running   7 (10h ago)   22h
kube-system            kube-apiserver-k8s-master1                   1/1     Running   6 (10h ago)   22h
kube-system            kube-controller-manager-k8s-master1          1/1     Running   4 (10h ago)   22h
kube-system            kube-proxy-9z2bm                             1/1     Running   2 (10h ago)   22h
kube-system            kube-proxy-k8q7w                             1/1     Running   0             3m21s
kube-system            kube-proxy-vh5hc                             1/1     Running   1 (10h ago)   11h
kube-system            kube-scheduler-k8s-master1                   1/1     Running   6 (10h ago)   22h
kubernetes-dashboard   dashboard-metrics-scraper-799d786dbf-dkm47   1/1     Running   1 (10h ago)   21h
kubernetes-dashboard   kubernetes-dashboard-546cbc58cd-c55gt        1/1     Running   1 (10h ago)   21h


# 周期性查看
$ watch -n 1 kubectl get pods -A

第六章 退群与重新入群

6.1 在mananger节点退出

(1)先将节点设置为维护模式

$ kubectl drain k8snode02 --delete-local-data --force --ignore-daemonsets node/k8snode02 

(2)删除节点

$ kubectl delete node k8snode02

(3)确认是否已经删除

$ kubectl get nodes

6.2 在node节点重新加入

(1)停止kubelet

$ kubeadm reset

(2)删除配置文件

$ rm -rf /etc/kubernetes/*

(3)重新加入

$ kubeadm join 

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

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122785801

以上是关于[云原生专题-25]:K8S - Kubernetes(K8S)Master集群构建与安装过程详细解读 - worker节点的安装与加入的主要内容,如果未能解决你的问题,请参考以下文章

[云原生专题-29]:K8S - 核心概念 - 名字空间/命名空间概念详解与主要操作案例

[云原生专题-23]:K8S - Kubernetes(K8S)整体概述与组件架构通俗讲解

[云原生专题-46]:Kubesphere云治理-安装-在K8S的基础之上快速安装

[云原生专题-22]:K8S - 集群编排工具K8S与SWARM比较与技术选择

[云原生专题-43]:K8S - 核心概念 - placeholder - 加密数据

[云原生专题-42]:K8S - 核心概念 - placeholder-有状态服务