k8s目前市面上主流的多机多容器编排技术,实现服务的动态扩缩容。
一、k8s主要组件介绍
1、资源类组件
2、命令执行类组件
二、k8s集群搭建
k8s官网搭建网址 主要介绍了kind、minikube、kubeadm三方搭建方式。
本文采用kubeadm的方式搭建k8s集群,采用一主两从的模式,共需三台机器。
kubeadm官网链接
版本信息(版本不匹配可能会安装不上):
docker:20.10.7
kubeadm-1.19.0-0
kubelet-1.19.0-0
kubectl-1.19.0-0
下面7个组件的版本会根据安装的kubeadm版本的不同而不同,我这里使用的kubeadm是1.19.0-0版本所以是以下7个版本
k8s.gcr.io/kube-apiserver:v1.19.0
k8s.gcr.io/kube-controller-manager:v1.19.0
k8s.gcr.io/kube-scheduler:v1.19.0
k8s.gcr.io/kube-proxy:v1.19.0
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.9-1
k8s.gcr.io/coredns:1.7.0
calico:v3.9 做k8s集群间网络通信
注意:以下操作除单独说明master和worker节点设置之外,其他的设置master和worker节点一样即master和worker节点都需要设置。
1、准备集群环境需要的机器
准备三台centos机器,且三台机器之间可相互通信。
机器配置要求:
内存:2G及以上
CPU:2核及以上
防火墙关闭或需要将k8s交互所需端口都放开:
systemctl stop firewalld && systemctl disable firewalld #关闭防火墙并关闭防火墙开机自启
2、更新yum源
原因是老版本的yum源可能一些组件没有
yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
这一步可能耗时会久一些,耐心等待即可。
3、安装Docker
4、修改hosts文件
a、master节点
sudo hostnamectl set-hostname master #修改master节点hostname
修改master节点hosts文件
vi /etc/hosts
master节点ip master
worker1节点ip worker1
worker2节点ip worker2
b、两个worker节点
sudo hostnamectl set-hostname worker1 #修改worker1节点hostname
sudo hostnamectl set-hostname worker2 #修改worker2节点hostname
修改worker1、worker2节点hosts文件
vi /etc/hosts
master节点ip master
worker1节点ip worker1
worker2节点ip worker2
设置好之后,在机器中分别ping另外两台机器的hostname,测试是否能够通信;如:master节点中测试:ping worker1和ping worker2。
5、系统设置
a、关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
b、关闭swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
c、配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
d、设置系统参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
6、设置k8s yum源
原因在于k8s的相关组件,如kubectl、kubelet,以及安装k8s所需的kubeadm默认会从国外谷歌云拉取,可能会很慢或者拉取不成功。
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
7、安装kubeadm&kubelet&kubectl
yum install -y kubeadm-版本号 kubelet-版本号 kubectl-版本号
我这里使用的是1.19.0-0的版本:
yum install -y kubeadm-1.19.0-0 kubelet-1.19.0-0 kubectl-1.19.0-0
某些版本安装不成功会报错如下:
如果报错可以查看kubeadm有哪些可安装的版本(同样kubectl、kubelet也有对应的版本):
yum list kubeadm --showduplicates | sort -r
然后试试其他的版本是否可以安装成功。
8、docker和k8s设置同一个cgroup
docker设置:
vi /etc/docker/daemon.json #编辑daemon文件
"exec-opts": ["native.cgroupdriver=systemd"] #加入这行配置
如果在daemon中加入"exec-opts": [“native.cgroupdriver=systemd”]配置,后面还有配置的话需要加 ,
后面没有配置无需加 ,
重启docker
systemctl restart docker #重启docker方可生效
k8s设置:
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
如果提示文件或目录不存在是正常的。
重启kubelet
systemctl enable kubelet && systemctl start kubelet #将kubectl加入开机自启并启动
这一步不设置后面第10步,执行master节点初始化会失败,报错如下:
提示的解决方案推荐 cgroup 使用 systemd ,可参照该网址设置:
https://kubernetes.io/docs/setup/cri/
9、下载kubeadm搭建集群需要的组件的image
这些组件包含比如kube-api-server、kube-controller-manager、etcd等等,总共7个组件
查看kubeadm需要下载哪些组件image:
kubeadm config images list
所需组件都是这7个,但是根据刚刚安装的kubeadm的版本不同,所需要的这7个组件的版本也不一样
此时,可以看到所需的7个组件都位于k8s.gcr.io仓库中,在没有科学上网的情况下,这7个组件是无法使用docker pull拉取成功的,所以Linux可以科学上网的情况下直接docker pull拉取就行了。
接下来拉取这7个组件的镜像,不能科学上网解决方案如下:
国内阿里云有一个谷歌的容器镜像仓库,可以从这个仓库中拉取这些组件:
registry.cn-hangzhou.aliyuncs.com/google_containers
拉取的image名称就是将上面看到的k8s.gcr.io换成registry.cn-hangzhou.aliyuncs.com/google_containers即可,拉取完毕之后还需要使用docker tag命令将对应的组件标记一份名称为k8s.gcr.io开头,然后就可以将阿里云拉取的image删除。
比如拉取 k8s.gcr.io/kube-apiserver:v1.19.0 镜像命令如下:
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.19.0 #拉取镜像
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.19.0 k8s.gcr.io/kube-apiserver:v1.19.0 #将阿里云拉取的image标记为kubeadm需要的组件名称即k8s.gcr.io开头的名称
docker rmi -f registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.19.0 #将阿里云拉取的image删除
按照上面的方式每个组件都来一次,总共七次就可完毕。
为了方便可以将这个过程写成shell脚本执行。
vi kubeadm.sh #创建shell文件
编写shell文件,如果安装的kubeadm不是1.19.0-0版本,修改下所需版本号
#!/bin/bash
set -e
KUBE_VERSION=v1.19.0
KUBE_PAUSE_VERSION=3.2
ETCD_VERSION=3.4.9-1
CORE_DNS_VERSION=1.7.0
GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${CORE_DNS_VERSION})
for imageName in ${images[@]} ; do
docker pull $ALIYUN_URL/$imageName
docker tag $ALIYUN_URL/$imageName $GCR_URL/$imageName
docker rmi $ALIYUN_URL/$imageName
done
执行shell脚本,直接使用./kubeadm.sh可能会提示权限不够
sh ./kubeadm.sh
等待拉取image完毕。
查看所需7个image三台机器是否都拉取完毕
docker images
注意:如果这里拉取的7个组件的版本和 kubeadm config images list 查看的需要的版本不匹配会导致第10步初始化master节点不成功。
10、初始化master节点-本小节只在master中执行
master节点:
kubeadm init --kubernetes-version=版本号 --apiserver-advertise-address=master节点ip --pod-network-cidr=pod网段信息
如:我这里k8s使用的1.19.0版本,后面的参数都是可选参数,可以直接使用kubeadm init
kubeadm init --kubernetes-version=1.19.0 --apiserver-advertise-address=192.168.117.128 --pod-network-cidr=10.244.0.0/16
结尾输出以下信息表示主节点初始化成功
即以下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
执行这三句命令
worker节点加入集群的命令(先不执行,但保存好后面第12步需要用)
kubeadm join 192.168.117.128:6443 --token tdhn0d.4izxf7blxef97osl \
--discovery-token-ca-cert-hash sha256:5bc89e247ad5a96801987cf2dc10688d4741fb265b0cc43ab98d3779b3973466
此时看一下,k8s需要的组件是否全部启动成功(这些组件以pod的形式运行的)
kubectl get pods -n kube-system #其中kube-system是指系统的namespace
可以看到关于dns的两个pod未执行,也就是说k8s的集群网络未启动,类似于docker swarm需要overlay网络进行跨机通信一样
11、安装网络插件-本小节只在master中执行
k8s支持的网络插件
这里选用calico作为k8s网络插件
在k8s中安装calico插件官网链接
master节点:
可以直接执行下面的命令进行创建pod
kubectl apply -f yml文件 是k8s中运行pod的命令
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml
也可以先将calico.yaml文件中使用的image拉取下来,节约kubectl apply的时间也防止因为拉取image失败导致apply失败。
即需要下面几个image
docker pull calico/pod2daemon-flexvol:v3.9.6
docker pull calico/node:v3.9.6
docker pull calico/kube-controllers:v3.9.6
docker pull calico/cni:v3.9.6
下载完calico.yaml文件需要的几个image之后,再执行上面的kubectl apply创建pod。
创建成功后,需要等待一会儿,再次查看 kubectl get pods -n kube-system 可以发现需要的pod都已经成功运行。
12、将worker节点加入到集群中-本小节只在两个worker中执行
两个worker节点都执行(即上面第10步保存的命令):
kubeadm join 192.168.117.128:6443 --token tdhn0d.4izxf7blxef97osl \
--discovery-token-ca-cert-hash sha256:5bc89e247ad5a96801987cf2dc10688d4741fb265b0cc43ab98d3779b3973466
13、查看k8s集群是否搭建成功
两个worker节点执行join完毕之后,在master节点中查看集群节点信息
kubectl get nodes
worker节点也是Ready状态即成功,如果是NotReady状态,稍等再次查看,正常情况worker节点就会变为Ready状态。
查看集群需要的基础pod是否都成功运行
kubectl get pods -n kube-system #查看kube-system命名空间下的pod运行情况
kubectl get pods -n kube-system -o wide #查看kube-system命名空间下的pod运行情况(包含ip、节点等信息)
如果出现worker节点的calico-node是PodInitializing状态,可以等下再查看,正常情况下就会是Running状态。
到此如果两个worker节点是Ready状态并且kube-system命名空间下的pod都是Running状态,说明k8s通过kubeadm搭建一主两从的集群模式成功。