应公司领导要求,需要部署一下k8s以及kubeflow来构建公司内部机器学习的容器管理。在此记录一下k8s的部署过程以及遇到的问题。
以下内容都在root用户下操作。
#临时关闭
swapoff -a
#永久关闭
vi /etv/fstab 注释掉包含swap的一行
#关闭防火墙
ufw disable
#配置阿里源
sudo echo “deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main” > /etc/apt/sources.list.d/kubernetes.list
#更新
apt update
apt install -y kubelet kubeadm kubectl
需要确保kubelet和cgroup driver的docker一致
查看命令:
docker info | grep -i cgroup
cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
若不一致,则添加如下命令到到/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
Environment=“KUBELET_CGROUP_ARGS=–cgroup-dirver=cgroupfs”
systemctl enable kubelet && systemctl start kubelet
若启动时提示无cgroup请自己百度安装。
在/etc/apt/sources.list中添加阿里源:
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
apt update更新一下源
然后kubeadm config images list查看我们所需要的镜像。
然后可以选择适当的国内镜像地址把镜像都拉下来,以免被墙,当然如果读者可以科学上网的话,此阶段完全没必要操作。
docker pull googlecontainer/kube-apiserver:v1.15.3
docker pull mirrorgooglecontainers/kube-controller-manager:v1.15.3
docker pull mirrorgooglecontainers/kube-scheduler:v1.15.3
docker pull mirrorgooglecontainers/kube-proxy:v1.15.3
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.3.10
docker pull coredns/coredns:1.3.1
具体版本请自行修改。如果你的版本在上述镜像地址中不存在,请自行查找。
接下来修改tag为k8s执行init检查的镜像:
docker tag googlecontainer/kube-apiserver:v1.15.3 k8s.gcr.io/kube-apiserver:v1.15.3
docker tag mirrorgooglecontainers/kube-controller-manager:v1.15.3 k8s.gcr.io/kube-controller-manager:v1.15.3
docker tag mirrorgooglecontainers/kube-scheduler:v1.15.3 k8s.gcr.io/kube-scheduler:v1.15.3
docker tag mirrorgooglecontainers/kube-proxy:v1.15.3 k8s.gcr.io/kube-proxy:v1.15.3
docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
至此所有基础的环境已经安装完成,之后请注意在master还是node节点的操作
kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=v1.15.3 --apiserver-advertise-address=192.168.11.117
pod-network-cidr: 选项–pod-network-cidr=10.0.0.0/24表示集群将使用网络的子网范围;
选项–kubernetes-version=v1.14.2指定K8S版本,必须和前面导入的镜像一致。
选项–apiserver-advertise-address表示绑定的网卡IP,这里是指定所用网络的网卡。
若执行kubeadm init出错或强制终止,则再需要执行该命令时,需要先执行kubeadm reset重置。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown ( i d − u ) : (id -u): (id−u):(id -g) $HOME/.kube/config
配置网络
kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml
此处的本版不一定是最新的,若有需要请去官网查阅kubernetes
将master设为工作节点。由于笔者master节点的性能较高,完全可以胜任master和node的工作压力。此处请读者根据需要选择是不是设为工作节点。
kubectl taint nodes --all node-role.kubernetes.io/master-
执行成功会返回如下类似的代码
node/psps-SYS-7048GR-TR untainted
还有一个非必选的选项,可以修改k8s中的主机名
hostnamectl set-hostname new-name
至此,master节点的配置已经完成。可以使用kubectl get nodes 查看节点的状态。
普通节点非常简单,只需执行
kubeadm join 10.0.2.15:6443 --token zuhiop.bmxq2jofv1j68o9o
–discovery-token-ca-cert-hash sha256:b65ca09d1f18ef0af3ded2c831c609dfe48b19c5dc53a8398af5b735603828fb
上述命令在kubeadm init的最后输出会有,请以读者自己的为准,而且这个是只有24小时的时效性的。因此,当以后还想加入节点时,可以先用kubeadm token list命令查看当前的token表,并在master节点上执行
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed ‘s/^.* //’
1.coredns状态CrashLoopBackOff的问题
此问题是由于路由造成的循环,只需要将/etc/resolv.conf文件中的nameserver 127.0.0.1修改成 nameserver 114.114.114.114就可以了。这样修改不知道后续会有什么问题,如果遇到问题,笔者会再来进行更新。
后续更新:
当您使用kubeadm init时,请指定pod-network-cidr。确保主机/主网络的IP不在您引用的子网中。
即如果您的网络运行在192.168.*.使用10.0.0.0/16
如果您的网络是10.0..使用192.168.0.0/16
我忘了子网是如何工作的,所以我没有意识到192.168.0.1与192.168.100.0/16在同一子网中。简而言之,当您使用16子网标记时,它意味着使用192.168..*中的任何内容。
由于我的网络运行在192.168.1。*主机在192.168.0上运行正常。*但我的工作人员无法通信,因为它试图在192.168.1上运行。*因此很好地导致我的盒子上的路由问题。
原文链接
2.执行kubectl get nodes时发现有的节点是NoReady
这个问题只需要在对应的节点上重启一下docker服务就可以了。
3.coredns一直处于处于ContainerCreating状态,查看日志发现
NetworkPlugin cni failed to set up pod “coredns-5c98db65d4-kgf4s_kube-system” network: failed to set bridge addr: “cni0” already has an IP address different from 10.0.0.1/24
kubeadm reset #重置节点
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /var/lib/etcd
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
systemctl start docker
依次执行上述命令,然后按照安装步骤重新安装