vlambda博客
学习文章列表

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-utilsyum-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_netfilterbr_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.confbr_netfilterEOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOFsudo 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-TUNAbaseurl=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=0EOF

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 nodesNAME STATUS ROLES AGE VERSIONmaster-1.for-best.cn NotReady control-plane,master 26m v1.21.2node-1.for-best.cn NotReady <none> 3m23s v1.21.2node-2.for-best.cn NotReady <none> 3m24s v1.21.2node-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 nodesNAME STATUS ROLES AGE VERSIONmaster-1.for-best.cn Ready control-plane,master 16h v1.21.2node-1.for-best.cn Ready <none> 15h v1.21.2node-2.for-best.cn Ready <none> 15h v1.21.2node-3.for-best.cn Ready <none> 15h v1.21.2


为ready的状态,表示工作正常

1.查看kube-system名称空间的工作状态


[root@master-1 ~]# kubectl get pods -n kube-systemNAME READY STATUS RESTARTS AGEcoredns-558bd4d5db-qj4t5 1/1 Running 1 16hcoredns-558bd4d5db-tq9sv 1/1 Running 1 16hetcd-master-1.for-best.cn 1/1 Running 1 16hkube-apiserver-master-1.for-best.cn 1/1 Running 1 16hkube-controller-manager-master-1.for-best.cn 1/1 Running 1 16hkube-flannel-ds-dgn27 1/1 Running 1 15hkube-flannel-ds-lqdds 1/1 Running 1 15hkube-flannel-ds-njj6b 1/1 Running 1 15hkube-flannel-ds-rjx5q 1/1 Running 0 15hkube-proxy-cgbt6 1/1 Running 1 16hkube-proxy-ffbxs 1/1 Running 0 15hkube-proxy-lq2s8 1/1 Running 0 15hkube-proxy-z55bl 1/1 Running 0 15hkube-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 podsNAME READY STATUS RESTARTS AGEnginx 0/1 ContainerCreating 0 8s
[root@master-1 ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx 0/1 ContainerCreating 0 23s <none> node-3.for-best.cn <none> <none>
[root@master-1 ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx 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 andworking. 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