最近服务器出了点问题,加上一直以来大量运维工作令人崩溃,终于第二次下定决心把K8S装上。
但是虽然距离上次踩坑才过去一年,但这个坑却丝毫没有变浅。
加上之前用的是熟练的Ubuntu,这次又换了Centos,感觉需要重新学的东西挺多的。
一、安装kubelet kubeadm kubectl
首先是三件套的安装,一般来说yum和apt都是装不了的,但还好阿里云提供了资源。
按照上面的说明,执行以下代码进行安装
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
ps: 由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl
安装
下面是ubuntu的安装手法
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 <<EOF >/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
# 在node节点运行
apt-get install -y kubelet kubeadm
# 安装指定版本:
apt-get install kubeadm=1.18.2-00 kubectl=1.18.2-00 kubelet=1.18.2-0
二、下载kubeadm所需要镜像
执行kubeadm config images list
可以知道初始化一个集群需要什么镜像,但是k8s.gcr.io我国是用不了的,所以还是得依靠阿里云的源。
我们通过一个shell脚本来假装这个东西是从官方下载的。
#!/bin/sh
images=(
kube-apiserver:v1.18.2
kube-controller-manager:v1.18.2
kube-scheduler:v1.18.2
kube-proxy:v1.18.2
pause:3.2
etcd:3.4.3-0
coredns:1.6.7
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName} k8s.gcr.io/${imageName}
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
done
这个脚本要在所有的服务器上运行,不然join的时候没办法创建容器
三、初始化
首先关闭防火墙和selinux。
sudo systemctl disable firewalld
sudo systemctl status firewalld
sudo iptables -P INPUT ACCEPT
sudo iptables -F
Docker和CRI-O都是运行时容器管理工具,后者较轻量一些,但是Docker大家都比较熟悉,所以启动的时候使用Docker作为CRI。(记得Docker要19.03以上)
kubeadm init --cri-socket /var/run/dockershim.sock
这时候如果要选择比如Calico这种网络库,则要指定特定子网,具体方案根据官网的安装需求推荐,下面这个是Calico需要的配置,如果是flannel则为--pod-network-cidr=10.244.0.0/16
kubeadm init --cri-socket /var/run/dockershim.sock --pod-network-cidr=192.168.0.0/16
之后kubeadm会执行一系列的检测(preflight)
[preflight] Running pre-flight checks
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
比如我这里有一个建议让我换docker cgroup引擎的警告。编辑/etc/docker/daemon.json
加入
{
....
"exec-opts":["native.cgroupdriver=systemd"]
}
然后重启Docker
systemctl restart docker
systemctl status docker
如果初始化有问题,想要重新init,可以运行kubeadm reset
,之后再重新初始化。
初始化的最后会显示,把下面这行保存下来。
kubeadm join 172.18.182.32:6443 --token ??????????????????? \
--discovery-token-ca-cert-hash sha256:?????????????????????????
然后我们执行下面的命令,记住要用非root用户,root用户没办法自动读取config
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
而需要这些配置命令的原因是:Kubernetes 集群默认需要加密方式访问。所以,这几条命令,就是将刚刚部署生成的 Kubernetes 集群的安全配置文件,保存到当前用户的.kube 目录下,kubectl 默认会使用这个目录下的授权信息访问 Kubernetes 集群。如果不这么做的话,我们每次都需要通过 export KUBECONFIG 环境变量告诉 kubectl 这个安全配置文件的位置。
这个时候查看node状态
[root@sp-141 kubernetes]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
sp-141 NotReady master 107m v1.18.2
发现我们的sp-141是NotReady的状态,这是为什么呢?
我们通过kubectl describe node sp-141
来找找原因,在调试 Kubernetes 集群时,最重要的手段就是用 kubectl describe 来查看这个节点(Node)对象的详细信息、状态和事件(Event)。
Ready False Sat, 09 May 2020 13:58:56 +0800 Sat, 09 May 2020 12:13:22 +0800 KubeletNotReady runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
哦!原来是网络插件没有初始化~
另外,我们还可以通过 kubectl 检查这个节点上各个系统 Pod 的状态,其中,kube-system 是 Kubernetes 项目预留的系统 Pod 的工作空间(Namepsace,注意它并不是 Linux Namespace,它只是 Kubernetes 划分不同工作空间的单位)
[root@sp-141 kubernetes]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-66bff467f8-955g4 0/1 Pending 0 114m
coredns-66bff467f8-vrnhx 0/1 Pending 0 114m
etcd-sp-141 1/1 Running 2 114m
kube-apiserver-sp-141 1/1 Running 2 114m
kube-controller-manager-sp-141 1/1 Running 1 114m
kube-proxy-42m5s 1/1 Running 0 114m
kube-scheduler-sp-141 1/1 Running 1 114m
四、安装网络插件
CNI意为容器网络接口,它是一种标准的设计,为了让用户在容器创建或销毁时都能够更容易地配置容器网络。插件负责为接口配置和管理IP地址,并且通常提供与IP管理、每个容器的IP分配、以及多主机连接相关的功能。容器运行时会调用网络插件,从而在容器启动时分配IP地址并配置网络,并在删除容器时再次调用它以清理这些资源。
常用的网络插件有Flannel、Calico、Canal、Weave,它们各有优势,请选择使用。
目前比较流行的插件请看这里
如果是用Calico或者Cilium,需要再kubeadm的时候指定--pod-network-cidr=x.x.x.x.
所以我们这里先用weave。
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
但是这个用不了,所以我们重新搞一遍,安装Calico。
kubeadm reset
kubeadm init --cri-socket /var/run/dockershim.sock --pod-network-cidr=192.168.0.0/16
kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml
# 或者
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
虽然执行后等了一会,但总算还是可以了,所以选择最推荐的那个addon准没错。
五、加入Worker节点
kubeadm join 172.18.182.32:6443 --token ??????????????????? \
--discovery-token-ca-cert-hash sha256:?????????????????????????
之后发现有一些pod都是pendding状态,使用kubectl describe pod kube-proxy-4cnfb --namespace=kube-system
查看日志,发现是worker节点镜像拉不到,我们就运行一下那个脚本。
然后过了一会,发现master节点一直没有ready
我们下载下来Calico的yml文件,进行修改(rollo modified的那三行)
# Cluster type to identify the deployment type
- name: CLUSTER_TYPE
value: "k8s,bgp"
# rollo modified
- name: IP_AUTODETECTION_METHOD
value: "interface=eth.*"
# Auto-detect the BGP IP address.
- name: IP
value: "autodetect"
然后重新apply这个yml,一会儿过后,全都正常了
六、使Master结点也可以部署POD
当然我们不是很建议这么搞
kubectl taint nodes --all node-role.kubernetes.io/master-
输出类似这样
node/sp-141 untainted
taint "node-role.kubernetes.io/master" not found
taint "node-role.kubernetes.io/master" not found
七、安装面板
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
kubectl get pods --all-namespaces
需要打开proxy来开放端口
kubectl proxy
当然现在也看不了,因为安全性考虑没有打开远程连接,之后的折磨再战吧!