前言

kubernetes,源于希腊文,译为舵手飞行员,是谷歌公司于2014年推出的生产级别的容器管理工具。

由于k和s之间存在8个字母,故kubernetes被简称为k8s。

k8s是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。

具体可参照k8s官网说法:​​k8s官网​


由于内容过于多了,我会在以后的文章中再逐次讲到,本文我们着重搭建一个k8s的基础集群。


环境

由于我们需要三台主机去搭建环境,故我们采用一主二从模式。

这三台机的信息可以参考下表(括号中添加的是服务的默认端口)

kubernetes 搭建集群_ico

部署

根据上表所列的信息,我们可以这些服务分为两部分:

1. 三台机共有的服务

2. master节点独有的服务


下面我们开始部署:

1. 基础准备

1.1 安装docker(三台机)
yum install -y yum-utils device-mapper-persistent-data lvm2 lsof  #基础安装包
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #指定yum的默认源为阿里
yum install -y docker
systemctl enable --now docker


1.2 基础设置(三台机)
systemctl disable --now firewalld  #关闭防火墙
setenforce 0 #关闭selinux
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

swapoff -a #关闭交换分区
sed -i 's/.*swap.*/#&/' /etc/fstab
cat <<EOF > /etc/sysctl.d/k8s.conf #打开内核设置
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system


1.3 安装kubeadm/kubelet/kubectl
cat <<EOF > /etc/yum.repos.d/kubernetes.repo  #指定k8s的安装源为阿里源
[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
# 安装kubeadm、kubectl、kubelet,此处也可指定特定版本,如kubectl-1.16.0
yum install -y kubectl kubeadm kubelet
# 启动kubelet服务
systemctl enable --now kubelet

此时我们需要在master主机检查docker images的情况,看看k8s的各组件是否都存在,具体有:

[root@vm1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.aliyuncs.com/google_containers/kube-apiserver v1.22.0 838d692cbe28 4 days ago 128 MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.22.0 5344f96781f4 4 days ago 122 MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.22.0 3db3d153007f 4 days ago 52.7 MB
registry.aliyuncs.com/google_containers/kube-proxy v1.22.0 bbad1636b30d 4 days ago 104 MB
registry.aliyuncs.com/google_containers/etcd 3.5.0-0 004811815584 7 weeks ago 295 MB
registry.aliyuncs.com/google_containers/coredns v1.8.4 8d147537fb7d 2 months ago 47.6 MB
registry.aliyuncs.com/google_containers/pause 3.5 ed210e3e4a5b 4 months ago 683 kB

这些组件有相同的前缀registry.aliyuncs.com/google_containers, 只有凑齐这些组件之后,才能初始化k8s的master节点。否则在初始化时,会出现以下问题:

[root@vm1 ~]# kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.22.0 --apiserver-advertise-address 192.168.1.175 --pod-network-cidr=10.244.0.0/16 --token-ttl 0
[init] Using Kubernetes version: v1.22.0
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/coredns:v1.8.4: output: Trying to pull repository registry.aliyuncs.com/google_containers/coredns ...
Pulling repository registry.aliyuncs.com/google_containers/coredns
Error: image google_containers/coredns:v1.8.4 not found
, error: exit status 1

此问题是说,某个组件未在registry.aliyuncs.com/google_containers下找到,组件缺失无法初始化。原因你懂的。所以我们只需要去拉个相应的image下来,然后改个名字就可以。

[root@vm1 ~]# docker pull coredns/coredns:1.8.4
[root@vm1 ~]# docker tag coredns/coredns:1.8.4 registry.aliyuncs.com/google_containers/coredns:v1.8.4
[root@vm1 ~]# docker rmi coredns/coredns:1.8.4

这样就可以搞定这个问题了。


2. 初始化

2.1 初始化master主机
kubeadm init --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 192.168.1.106 --apiserver-bind-port 6443 --kubernetes-version 1.22.0 --pod-network-cidr 10.244.0.0/16 --token-ttl 0 #此处token-ttl=0表示此token永远有效。

然后等4分钟左右,完成之后就会出现以下信息:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.1.106:6443 --token jx4yyr.r2cyxjfesfz43wwz \
--discovery-token-ca-cert-hash sha256:ab78736522a383c49f7a4fc9c55fdd5ebde8a19fb71ec2ed3b9e5d3133f2b53e

出现上述信息说明master节点初始化成功,我们按照它的指引,使用相应的用户运行这三行命令:

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

即可使用kubectl命令。


2.2 将node节点加入到集群中

在另外两台node节点上,运行kubeadm join命令,即可将node节点加入到集群中。

kubeadm join 192.168.1.106:6443 --token jx4yyr.r2cyxjfesfz43wwz \
--discovery-token-ca-cert-hash sha256:ab78736522a383c49f7a4fc9c55fdd5ebde8a19fb71ec2ed3b9e5d3133f2b53e

需要注意的是,若不加--token-ttl参数,此token默认的有效期是24小时,过期后需要在master节点重新生成新的join命令。

生成的命令如下:

kubeadm token create -ttl 0


2.3 安装网络插件

虽然node节点已经被纳入集群,但是它们之间仍然无法通信,原因是尚未安装内网插件。 此处我们需要安装它,才可以使得集群内部正常通信。

常用的网络插件有flannel、calico、 weave,本例使用calico,原因是比较方便。

我们首先下载一个配置文件模板calico.yaml,然后修改配置,将CALICO_IPV4POOL_CIDR的值修改为init时的CIDR值,作为内网的ip池, 最后启动它。

[root@vm1 ~]# wget https://docs.projectcalico.org/manifests/calico.yaml
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
[root@vm1 ~]# kubectl apply -f calico.yaml #修改之后再启动


3. 查看状态

3.1 查看nodes节点状态

在node节点都加入集群,且启动calico之后,我们可以查看集群状态。

[root@vm1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vm1 Ready control-plane,master 3h54m v1.22.0
vm2 Ready <none> 3h54m v1.22.0
vm3 Ready <none> 3h54m v1.22.0

三台机都是ready状态,说明搭建成功。


3.2 查看service状态
[root@vm1 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h55m

有kubernetes的服务,成功。


后记

这篇文章我想写很久了,今天也是将其完成,非常高兴。

由于k8s真的很复杂,调试过程也是各种痛苦,所以我省略了很多内容,以后有机会再跟大家讲。

最后说一句,Hyper-V是牛逼啊,我所有的操作居然都保留下来了,所以我可以查到非常久远的记录,也使得这篇文章相对详实不少。