一.简介

1.k8s和相关组件之前写的博客有简单介绍,https://blog.51cto.com/alibaby/11305601

如果docker是船,那么k8s就是这只船的舵手,k8s是建立在容器之上的技术之一,只为容器打造的集群管理工具,具有包括自动修复、弹性伸缩、自动调度、自动重启、自动备份、自动上线和版本回滚,服务发现和负载均衡等,在k8s世界里,一切皆容器。

2.k8s历史版本不完全统计

大概每3-4月发布一个版本,版本xyz: x主要版本,y次要版本,z补丁版本。k8s与docker无严格对应关系,对应为部署兼容。

2024年:1.30 

2023年:1.27 1.28 1.29 对应docker版本 20.10.x或更高

2022年:1.24 1.25 1.26 对应docker版本 20.10.x或更高

2021年:1.21 1.22 1.23  对应docker版本 20.10.x或更高

2020年:1.18 1.19 1.20  对应docker版本18.09x 19.03x 20.10.x

2019年:1.14 1.15 1.16 1.17 对应docker版本1.13.x 17.03.x 18.06.x 19.03.x(1.16/1.17)

官方网站       github上项目地址

3.部署方式   从简单到复杂

yum部署---单机部署Minikube---自动化部署测试版kubeadm ---手动二进制部署---源码编译部署

二.kubeadm方式部署

1.资源分配 centos7.4

master

192.168.77.135

4C 2G

node1

192.168.77.136

4C 2G

node2

192.168.77.137

4C 2G

node3

192.168.77.138

4C 2G

2.虚拟机准备,以下步骤k8s所有节点执行

官方安装指导文档

关闭swap分区。

临时关闭
swapoff -a && sysctl -w vm.swappiness=0
永久关闭
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

检查各个节点MAC地址或product_uuid,虚拟机可能会不一样。

ifconfig  ens33  | grep ether | awk '{print $2}'
cat /sys/class/dmi/id/product_uuid

检查所有节点之间的网络,要互通。

允许iptable检查桥接流量

cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

检查端口是否被占用

检查docker的环境

配置docker源,查看可安装的软件包,

已安装过RPM包下载地址

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates

安装指定的docker版本docker-ce-20.10.24

yum -y install docker-ce-20.10.24 docker-ce-cli-20.10.24
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion

配置docker优化

mkdir -pv /etc/docker && cat <<EOF | tee /etc/docker/daemon.json
{
  "registry-mirrors": ["https://4hmfxnwg.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

将harbor服务器的客户端证书拷贝到k8s集群的所有节点 harbor搭建参考

#k8s所有节点创建自建证书目录
mkdir -pv /etc/docker/certs.d/alibaby007.com
cd /etc/docker/certs.d/alibaby007.com
scp root@192.168.77.133:/etc/docker/certs.d/alibaby007.com/alibaby007.com.crt  .

配置docker开机自启动

systemctl enable --now docker
systemctl status docker

禁用防火墙

systemctl disable --now firewalld

禁用selinux

sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config  
grep ^SELINUX= /etc/selinux/config

配置host解析

cat > /etc/hosts << EOF
192.168.77.135      master
192.168.77.136      node1
192.168.77.137      mode2
192.168.77.138      mode3
192.168.77.133      alibaby007.com
EOF

cat /etc/hosts

k8s所有节点验证是否能够登录harbor仓库

docker login -u admin -p Harbor12345 alibaby007.com

3.所有节点安装kubeadm,kubelet,kubectl

配置Kubernetes软件源

cat  > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF

查看kubeadm的版本(安装K8S的所有组件版本均要保持一致!)

yum -y list kubeadm --showduplicates

安装kubeadm,kubelet,kubectl软件包 已下载的安装地址

yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0

启动kubelet服务(kubelet启动失败正常,会自动重启,因缺配置文件,初始化集群后恢复!)参考链接

systemctl enable --now kubelet
systemctl status kubelet

4.初始化control-plane/master节点

使用kubeadm初始化master节点,初始化成功后有一些提示信息需要操作

#仅master节点操作
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=alibaby007.com

相关参数说明:

--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”

拷贝授权文件,用于管理K8S集群

#master节点
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

 查看master组件状态componentstatuses

#master节点
kubectl get cs

5.配置所有worker节点加入k8s集群

#在node1-3上分别执行
kubeadm join 192.168.77.135:6443 --token 0cwies.1jh356dfk6c9ibbo --discovery-token-ca-cert-hash sha256:9eda62185ddbaa49e10cd586ba6404108c82e1affd9260320baf8a5444427444

查看现有的节点状态

#master节点
kubectl get nodes

NAME     STATUS     ROLES                  AGE     VERSION
master   NotReady   control-plane,master   34m     v1.23.17
node1    NotReady   <none>                 2m56s   v1.23.17
node2    NotReady   <none>                 3m6s    v1.23.17
node3    NotReady   <none>                 3m42s   v1.23.17

6.添加kubectl的自动补全功能

#master节点
echo "source <(kubectl completion bash)" >> ~/.bashrc && source ~/.bashrc

7.所有节点安装网络插件并验证连通性 

官方网络插件介绍     flannel安装说明

已准备好的kube-flannel镜像和kube-flannel.yml

#将flannel.tar.gz上传至集群各个节点,然后导入
docker load -i flannel.tar.gz

#将kube-flannel.yml上传至master节点后执行
kubectl apply -f kube-flannel.yml

下面这部分可不看
#master节点执行
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
#修改配置文件并应用
sed -i 's/10.244.0.0/10.100.0.0/g' kube-flannel.yml
kubectl apply -f kube-flannel.yml
#可能flannel会拉取失败,报错Init:ImagePullBackOff
kubectl get pods -A
#将提前下载好的docker load导入
docker load -i flannel.tar.gz 
kubectl delete -f kube-flannel.yml
kubectl apply -f kube-flannel.yml

安装flanne(值得注意的是,如果你的Pod网络和我的不一样"10.100.0.0/16",请自行修改配置文件)

检查flannel组件是否正常,均处于"Running"状态!

#master节点
kubectl get pods -A -o wide| grep kube-flannel

[root@master ~]# kubectl get pods -A -o wide| grep kube-flannel
kube-flannel   kube-flannel-ds-28pw6            1/1     Running   0          45m    192.168.77.138   node1    <none>           <none>
kube-flannel   kube-flannel-ds-k6vrf            1/1     Running   0          45m    192.168.77.137   node2    <none>           <none>
kube-flannel   kube-flannel-ds-mzdpj            1/1     Running   0          45m    192.168.77.135   master   <none>           <none>
kube-flannel   kube-flannel-ds-rtqr7            1/1     Running   0          45m    192.168.77.136   node3    <none>           <none>