CentOS 7 从0 开始部署Kubernetes (K8S安装)1.21版本最新版本安装
部署环境介绍
本次部署由4台服务器组成,1台Master角色,3台node角色
先决条件配置
setenforce 0 && sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/confi
5.关闭防火墙。shell命令
systemctl stop firewalld && systemctl disable firewalld
Kubernetes官网安装指引[2]
本文章中过程均采用和译自官网安装文档,精简其步骤,按照此博客可完成安装,本文章目的是记录下来安装过程以供日后参考安装使用,读者也可直接查看官网安装指引[3]
一,安装底层容器环境-Docker CE 3:20.10.7(所有节点都安装)
Kubernetes(简称K8S) 是一个容器编排工具,具体底层的容器运行平台可以支持多种,当前主流的容器运行平台为“Docker”,所以本次部署环境以Docker为底层的容器运行环境。
1.1 从Docker 官方YUM仓库中安装
Docker 官网安装指南[4]
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
1.2 安装Docker-CE
yum install docker-ce docker-ce-cli containerd.io -y
1.3 启动Docker
# systemctl start docker
1.4 运行Docker-容器环境
以下为需要在shell中执行的命令
docker run hello-world
1.5 使用systemd(systemctl )管理container的cgroup,需额外配置Docker的守护进程
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
注意:当Linux的kernel的版本高于4.0时,或者RHEL 和CentOS 的版本高于3.10.0-514时,overlay2的存储驱动是RHEL和CentOS操作系统优选的存储驱动。
1.6 将Docker 设置为服务器开机自启动
systemctl enable docker
二. 使用部署工具(Deployment tools)安装Kubernetes
注,官网介绍了3种部署工具部署K8S,
1.种是使用kubeadm部署自举式集群;(本部署使用)
2.种是使用kops安装在AWS上安装K8S集群;
3.种是使用kubespray将K8S部署在GCE(谷歌云), Azure(微软云), OpenStack(私有云), AWS(亚马逊云), vSphere(VMware vSphere), Packet (bare metal)(裸金属服务器), Oracle Cloud Infrastructure (Experimental)(甲骨文云基础设施)上的。
本次部署直接使用kubeadm部署工具直接将K8S集群安装在自己的数据中心中。
2.1 安装kubeadm(所有节点都安装)
2.1.1 安装之前需要确认的先决条件
2.1.2 禁用Swap设备(每台服务器都执行)
禁用swap,首先用命令禁用已经挂载的swap设备,然后修改/etc/fstab文件,让下次启动时不挂载swap设备。
1. 命令行中禁用当前运行的。
swapoff -a
2. 禁用下次开机启动的,修改/etc/fstab文件,将swap挂载注释掉
vim /etc/fstab
......
#UUID=fafe611e-2d60-4bf9-a5bc-aaa7528114b3 swap
## 在swap这一行最前面加上一个“#”就可以了
......
2.1.3 设置iptables 能够识别到桥接网络的流量
1.确认“br_netfilter”模块加载了,使用lsmod | grep br_netfilter 查看,加载的话可以使看到,如下面所示,所以没有加载,则使用命令“modprobe br_netfilter” 进行加载
[root@master-2 ~]# lsmod | grep br_netfilter
br_netfilter 22256 0
bridge 151336 1 br_netfilter
1.为了让主机的iptables 可以正确识别到桥接的流量,需要确保“net.bridge.bridge-nf-call-iptables”的值为1. 以下脚本可以帮你全部解决,,可直接复制粘贴到shell中执行:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
1 =
1 =
EOF
sudo sysctl --system
2.1.4 安装kubeadm, kubelet and kubectl
安装kubeadm, kubelet and kubectl官方介绍[1]
这3个组件各自是做什么用的?本博客中并不列出。但是需要知道一点的是,kubeadmin并不代理或者帮助安装kubelet和kubectl,所以需要手动安装在所需要的节点上,并且版本最好一致。
2.1.4.1 配置yum仓库
在国内,由于某些原因,无法访问Kubernetes官方的仓库站,所以配置官网的yum仓库也是无法获取的安装包的,所以这里使用其它的yum源。本博客使用“清华大学镜像站”[2] 配置yum源。
直接复制进入到shell界面运行
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes-TUNA]
name=Kubernetes-TUNA
baseurl=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF
2.1.4.2 安装kubeadm, kubelet and kubectl(所有节点都安装,包括worker,其中kubeclt在workder上是可选安装)
yum install -y kubelet kubeadm kubectl
2.1.4.3 设置kubelet 跟随服务器开机启动
systemctl enable --now kubelet
2.2 创建Kubernetes集群
2.2.1 初始化Master(Control-Plane)节点
2.2.1.1 初始化前先决条件确认
•国内出于某种原因,暂时不能访问“gcr.io”这个镜像站,可使用国内的镜像站,具体的方法请大家自行google,目标就是将相应版本的镜像下载到本地后可供使用。想省事的网友可直接查看我另外一遍博客kubernetes 曲线救国式下载 kubeadm 1.21 相关镜像[1]。
2.2.1.2 Master初始化
以下为完整的命令
kubeadm init --kubernetes-version=1.21.2 --apiserver-advertise-address=172.16.133.56 --control-plane-endpoint=cluster-endpoint.microservice.for-best.cn --service-cidr=10.1.0.0/16 --pod-network-cidr=10.2.0.0/16 --service-dns-domain=microservice.for-best.cn
初始化参数解析
选项 | 意义 |
--kubernetes-version=1.21.2 | 指明需要初始化的kubernetes的版本,默认值为stable-1 |
--apiserver-advertise-address=172.16.133.56 | Master服务器的API对外监听的IP地址是哪个IP,有的服务器有多个IP,可以指明一下IP地址,以示明确 |
--control-plane-endpoint=cluster-endpoint.microservice.for-best.cn | Master高可用时用到的,另外一篇博客详解Master的集群 |
--service-cidr=10.1.0.0/16 | Service的IP地址分配段 |
--pod-network-cidr=10.2.0.0/16 | Pod的IP地址分配段 |
--service-dns-domain=microservice.for-best.cn | Service的域名设置,默认是cluster.local,企业内部通常会更改 |
Your Kubernetes control-plane has initialized successfully! 标志着Master初始化成功
注意,在Master初始化完成后,在最后的输出中,会提示如何加入其它的Master,提示如何加入worker节点
2.2.1.3 Worker加入Master做为运行Pod的节点
直接在安装完成之后的Worker上输入Master初始化后的加入提示
以下为命令输入到Worker的shell窗口中(该内容为Master初始化完成后输出到屏幕上的,建议保存内容,以后加入节点都需要使用到)
kubeadm join cluster-endpoint.microservice.for-best.cn:6443 --token ii44ya.n4ryb3yka0q09fq3 \
--discovery-token-ca-cert-hash sha256:67318db78eef549400d515ed239ca3dbf85d5195e4ba6c13b61854f497278b39
2.2.1.4 配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
export KUBECONFIG=/etc/kubernetes/admin.conf
2.2.1.5 Master上查看集群
[root@master-1 yum.repos.d]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-1.for-best.cn NotReady control-plane,master 26m v1.21.2
node-1.for-best.cn NotReady <none> 3m23s v1.21.2
node-2.for-best.cn NotReady <none> 3m24s v1.21.2
node-3.for-best.cn NotReady <none> 3m23s v1.21.2
状态为NotReady的状态,使用journalctl -f -u kubelet 查看日志,有显示
Jul 08 17:30:50 master-1.for-best.cn kubelet[9263]: E0708 17:30:50.130903 9263 kubelet.go:2211] "Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized"
提示网络功能有问题,我们再安装一个网络功能附件
2.2.1.6 安装网络功能附件(Master上执行)
flannel托管在github上的安装使用介绍[2]
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
注意:虽然只在Master上执行,但是Worker会去下载相应的镜像,所以最好提供下载好镜像,特别是k8s.gcr.io/kube-proxy和k8s.gcr.io/pause 两个镜像
2.2.1.7 查看集群状态
1.查看集群节点工作状态
[root@master-1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-1.for-best.cn Ready control-plane,master 16h v1.21.2
node-1.for-best.cn Ready <none> 15h v1.21.2
node-2.for-best.cn Ready <none> 15h v1.21.2
node-3.for-best.cn Ready <none> 15h v1.21.2
为ready的状态,表示工作正常
1.查看kube-system名称空间的工作状态
[root@master-1 ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-558bd4d5db-qj4t5 1/1 Running 1 16h
coredns-558bd4d5db-tq9sv 1/1 Running 1 16h
etcd-master-1.for-best.cn 1/1 Running 1 16h
kube-apiserver-master-1.for-best.cn 1/1 Running 1 16h
kube-controller-manager-master-1.for-best.cn 1/1 Running 1 16h
kube-flannel-ds-dgn27 1/1 Running 1 15h
kube-flannel-ds-lqdds 1/1 Running 1 15h
kube-flannel-ds-njj6b 1/1 Running 1 15h
kube-flannel-ds-rjx5q 1/1 Running 0 15h
kube-proxy-cgbt6 1/1 Running 1 16h
kube-proxy-ffbxs 1/1 Running 0 15h
kube-proxy-lq2s8 1/1 Running 0 15h
kube-proxy-z55bl 1/1 Running 0 15h
kube-scheduler-master-1.for-best.cn 1/1 Running 1 16h
[root@master-1 ~]#
所以的pod运行均正常
2.3 创建第一个静态Pod
2.3.1 创建
直接在shell中运行以下命令,没有任何输出即表示创建成功:
kubectl run nginx --image=nginx --port=80
2.3.2 查看
[root@master-1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 0/1 ContainerCreating 0 8s
[root@master-1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 0/1 ContainerCreating 0 23s <none> node-3.for-best.cn <none> <none>
[root@master-1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 83s 10.2.6.2 node-3.for-best.cn <none> <none>
STATUS为Running 表示为运行状态。Pod的IP也有了,可以curl进行访问 被分配的运行Worker的节点在node-3.for-best.cn上运行。
2.3.3 curl访问测试
[root@node-3 ~]# curl 10.2.6.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
没有其它网络配置,不进行额外的访问测试,以上测试即表示正常。其它信息后续再谈。
References
[1]
kubernetes 曲线救国式下载 kubeadm 1.21 相关镜像: https://blog.csdn.net/Huangfei10086/article/details/118597445
[2]
安装kubeadm, kubelet and kubectl官方介绍: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-kubeadm-kubelet-and-kubectl[3]
“清华大学镜像站”: https://mirrors.tuna.tsinghua.edu.cn/
[4]
CentOS 配置ntp服务同步时间: https://blog.csdn.net/Huangfei10086/article/details/118567571[5]
Kubernetes官网安装指引: https://kubernetes.io/docs/setup/production-environment/[6]
Docker 官网安装指南: https://docs.docker.com/engine/install/centos/#installation-methods[7]
flannel托管在github上的安装使用介绍: https://github.com/flannel-io/flannel#deploying-flannel-manually