k8s架构图:
前言:本文以两台机器为例,叙述k8s的安装部署过程,1台机器为master节点,另一台为node节点,master节点不参与部署业务pod。服务器操作系统为Ubuntu18.04 Server
以下为Master节点和Node节点均需执行的部署前置操作
此处需要注意安装的Docker版本是否被k8s支持,比如k8s V1.20最高只支持Docker V19,那么安装Docker V20是不行的,可以在安装Docker指定Docker版本
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
# Step 5: 查看支持安装的Docker版本
apt-cache madison docker-ce
# Step 6: 安装指定版本的docker-ce
sudo apt-get -y install docker-ce=5:19.03.13~3-0~ubuntu-bionic
继续注意:安装完docker-ce后,使用docker --version命令看到的版本是docker cli版本,并不是docker server版本,而k8s是对docker server版本有要求,所以docker cli版本无所谓。安装docker-ce 19.03后,你会发现docker cli版本是20.10,这个是没关系的。可以使用docker info命令查看docker server版本
具体需要安装kubelet kubeadm kubectl。由于从国外下载需要,所以添加阿里的仓库,从阿里仓库下载
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat </etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
两种cgroup机制:cgroupfs和systemd
使用docker info命令查看docker使用的cgroup机制:
Cgroup Driver: cgroupfs
修改docker的cgroup机制为systemd,保持docker和k8s的cgroup机制一致。vim /etc/docker/daemon.json,写入以下内容:
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
重启docker:
systemctl restart docker
systemctl enable docker
# 临时
swapoff -a
# 永久
swapoff -a && sysctl -w vm.swappiness=0 # 关闭swap
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab # 取消开机挂载swap
注意:swapoff -a 命令只会临时关闭swap,如果采取该方式关闭swap,在重启系统后swap又会开启,将导致k8s启动失败。如果k8s启动失败,可以关闭swap后运行以下命令(该命令与部署无关,仅作提醒)
systemctl daemon-reload
systemctl restart kubelet
cat <
systemctl stop ufw
systemctl disable ufw
在Master节点上执行集群初始化命令,node节点不需要。
(1)初始化有很多参数可以选择,最重要的参数是指定国内镜像源,因为默认会从国外的仓库拉取所需镜像,需要挂代理。指定国内镜像源后可以直接下载,非常方便(https://www.cnblogs.com/zhaopengcheng/p/13582933.html)
--image-repository registry.aliyuncs.com/google_containers
k8s自身不携带CNI(Container Network Interface),所以需要依赖第三方的插件,例如比较常用的flannel。
Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。并使这些容器之间能够之间通过IP地址相互找到,也就是相互ping通。Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。Flannel实质上是一种“覆盖网络(overlaynetwork)”,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持udp、vxlan、host-gw、aws-vpc、gce和alloc路由等数据转发方式,默认的节点间数据通信方式是UDP转发。(https://www.cnblogs.com/goldsunshine/p/10740928.html#4752484)
有个很坑爹的地方,使用flannel需要在集群初始化时指定--pod-network-cidr,指定pod使用的IP地址块。如果在没有指定该参数的情况下初始化了集群,那么将无法成功安装flannel,我就遇到了这个问题,在只指定了使用国内仓库的情况下初始化了集群,导致集群网络出现问题,最后只好推倒重来。IP地址块参数自行决定,只要不和现有的IP冲突即可。
啰嗦完了,执行初始化命令,大概需要几分钟,因为需要从网络下载相关镜像:
kubeadm init --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr 10.244.0.0/16
(2)初始化成功后注意下命令的输出,你会看到以下内容:
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
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 : --token --discovery-token-ca-cert-hash sha256:
可以看到接下来有两个步骤:
1.创建kube相关目录,复制配置文件到相关目录
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.安装网络插件flannel(如果遇到网络不通问题,多试几次)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
3.保存好返回给你的kubeadm join命令,这是让你node节点加入集群的命令。token和ca-cert-hash参数需要保密,这是node加入集群的凭证
kubeadm join : --token --discovery-token-ca-cert-hash sha256:
如果没有记录kubeadm join命令,可以通过以下方式获取到相关参数:
手动获取获取token:
kubeadm token list
手动获取ca-cert:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
重新生成完整的加入集群的命令:
kubeadm token create --print-join-command
直接在Node节点上执行刚才保存的kubeadm join命令即可:
kubeadm join : --token --discovery-token-ca-cert-hash sha256:
kubectl get nodes
如果Node节点的status不为ready,可以稍微等一等,需要一定时间适配
kubectl get pods --all-namespaces
应该输出截图中的内容,需要注意的是如果网络配置没有问题,那么红框标注的容器应该均为Running状态。flannel容器初始化需要的时间比较长,可以稍微等等,不要急着进行别的操作。
初始化完成后默认所有节点都是没有角色的,需要手动设置节点角色
设置Master节点:
kubectl label nodes your_node_name node-role.kubernetes.io/master=
设置Node节点:
kubectl label nodes your_node_name node-role.kubernetes.io/node=
还发现一个情况,可以设置一个节点同时为master和node:
如果集群初始化之后,发现存在问题,例如init时缺少参数,导致需要重新初始化,可以采取以下措施:
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#tear-down
journalctl -f -u kubelet # 查看kubelet日志
journalctl -f -u kubelet > kubelet.log # 将日志输出到本地文件查看
k8s官方部署文档:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
安装部署:https://github.com/qxl1231/2019-k8s-centos
最后:本人也尚在初学阶段,如有错误,还请包涵,欢迎交流~