Ubuntu16.04安装kubernetes1.13集群
最新的安装可以使用以下方式:https://www.cnrancher.com/docs/rancher/v2.x/cn/overview/quick-start-guide
方便,快捷!
以下为正文。
前言
Docker容器化,虚拟化技术上的又一个猛将,可以极高提高软件部署的速度。运行一个Docker容器,这个容器作为一个进程分配了计算资源,不同容器之间资源隔离,仿佛每个容器都是一台机器,
并且通过宿主机网桥,可以模拟一个局域网。可以参考: 新手教程
Docker-compose可以管理单机上的容器们,但是多机管理还做不到,目前Kubernetes容器编排是最好的解决方案,可实现多机的容器编排。
Kubernetes简称为k8s,它是 Google 开源的容器集群管理系统。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
k8s因为种种原因,在中国很难安装得上,毕竟网不好。通过搭建k8s,我们也算追得上潮流。我们准备安装最新的k8s1.13。
准备工作
我们可以通过:VMware Workstation多台虚拟机安装 新建三台Ubuntu16.04
机器:
三台机器的主机名和IP
:
ubuntu1:192.168.152.3 4G内存 20G硬盘 必须2CPU核
ubuntu2:192.168.152.4 2G内存 20G硬盘
ubuntu3:192.168.152.5 2G内存 20G硬盘
我们必须永久关闭swap
空间:
先vim /etc/fstab
加#
注释掉所有swap
分区,然后重启三台机器!
安装k8s集群
以下的命令都是用root
用户进行。
安装Docker
在每台机器上运行Docker官方的安装脚本:
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
安装kubelet kubeadm kubectl
在4G内存的ubuntu1
机器上,更换阿里源,并安装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 <<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
使用kubeadm创建一个集群
1.13.0 版本提供了中国特供的一个功能,可以解决以前镜像被墙的问题。
kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=192.167.0.0/16 \
--ignore-preflight-errors=cri \
--kubernetes-version=1.13.1
镜像从registry.aliyuncs.com/google_containers
阿里云处下载,且pod
的网段改为192.167.0.0/16
(怕虚拟机与外部网络冲突了)。
耐心等待后出现:
Your Kubernetes master 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/
You can now join any number of machines by running the following on each node
as root:
kubeadm join 192.168.152.3:6443 --token to697t.fdu5pffmr0862z8g --discovery-token-ca-cert-hash sha256:15da0d9ac768ad5fe546a2b93ed7516222fa043ef9d5e454a72e1f2ca4870862
上面的kubeadm join 192.168.152.3:6443 --token to697t.fdu5pffmr0862z8g --discovery-token-ca-cert-hash sha256:15da0d9ac768ad5fe546a2b93ed7516222fa043ef9d5e454a72e1f2ca4870862
请记住。
然后你可以用普通用户,或者root
用户:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
这样你就可以使用该用户操作k8s
集群了。
我们可以使用kubectl get
命令来查看当前唯一一个节点的状态:
root@ubuntu1:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
ubuntu1 NotReady master 2m59s v1.13.2
我们可以使用kubectl describe
查看这个节点(Node)对象的详细信息、状态和事件(Event)信息:
root@ubuntu1:~# kubectl describe node ubuntu1
Name: ubuntu1
Roles: master
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/hostname=ubuntu1
node-role.kubernetes.io/master=
Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
node.alpha.kubernetes.io/ttl: 0
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Fri, 18 Jan 2019 10:34:29 +0800
Taints: node-role.kubernetes.io/master:NoSchedule
node.kubernetes.io/not-ready:NoSchedule
Unschedulable: false
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
MemoryPressure False Fri, 18 Jan 2019 10:39:19 +0800 Fri, 18 Jan 2019 10:34:29 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available
DiskPressure False Fri, 18 Jan 2019 10:39:19 +0800 Fri, 18 Jan 2019 10:34:29 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure
PIDPressure False Fri, 18 Jan 2019 10:39:19 +0800 Fri, 18 Jan 2019 10:34:29 +0800 KubeletHasSufficientPID kubelet has sufficient PID available
Ready False Fri, 18 Jan 2019 10:39:19 +0800 Fri, 18 Jan 2019 10:34:29 +0800 KubeletNotReady runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
我们知道NotReady
的原因是:
Ready False Fri, 18 Jan 2019 10:39:19 +0800 Fri, 18 Jan 2019 10:34:29 +0800 KubeletNotReady runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
因为我们尚未部署任何网络插件。
我们还可以通过kubectl
检查这个节点上各个系统Pod的状态,其中kube-system
是k8s项目预留的系统Pod的工作空间:
root@ubuntu1:~# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-78d4cf999f-7k9bv 0/1 ContainerCreating 0 7m6s
coredns-78d4cf999f-mtz4b 0/1 ContainerCreating 0 7m6s
etcd-ubuntu1 1/1 Running 0 6m16s
kube-apiserver-ubuntu1 1/1 Running 0 6m35s
kube-controller-manager-ubuntu1 1/1 Running 0 6m7s
kube-proxy-26mzm 1/1 Running 0 7m6s
kube-scheduler-ubuntu1 1/1 Running 0 6m31s
有些失败了,因为我们尚未部署任何网络插件。
默认情况下 Master 节点是不允许运行用户 Pod 的,而 Kubernetes 做到这一点,依靠的是 是 Kubernetes 的 Taint/Toleration 机制。一旦某个节点被加上了一个 Taint,即被“打上了污点”那么所有 Pod 就都不能在这个节点上运行,因为 Kubernetes 的 Pod 都有“洁癖”。
root@ubuntu1:~# kubectl describe node ubuntu1
Name: ubuntu1
Roles: master
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/hostname=ubuntu1
node-role.kubernetes.io/master=
Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
node.alpha.kubernetes.io/ttl: 0
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Fri, 18 Jan 2019 10:34:29 +0800
Taints: node-role.kubernetes.io/master:NoSchedule
可以看到Taints: node-role.kubernetes.io/master:NoSchedule
,我们去掉这个污点,一个单节点的集群就创建成功了,听起来十分有趣,单节点的集群。
我们现在执行:
kubectl taint nodes --all node-role.kubernetes.io/master-
这个步骤的配置最终使Master节点能允许运行用户pod,也是确保下面插件部署能正确运行。
到了这一步,一个基本完整的 Kubernetes 集群就完毕了!! 撒花,感谢之前写教程的大哥哥~~~~
部署插件
我们要安装一些插件来辅助k8s。
部署网络组件
直接运行安装
命令:
# 安装
kubectl apply -f https://git.io/weave-kube-1.6
# 删除
kubectl delete -f https://git.io/weave-kube-1.6
查看pod
是否部署成功:
kubectl get pods -n kube-system
部署容器存储插件
# 安装
kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/operator.yaml
kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/cluster.yaml
# 删除
kubectl delete -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/operator.yaml
kubectl delete -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/cluster.yaml
# 查看安装情况
kubectl get pods -n rook-ceph-system
kubectl get pods -n rook-ceph
工作节点加入master
在另外两台ubuntu
上安装kubeadm, kubelet and 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 <<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
然后输入:
kubeadm join 192.168.152.3:6443 --token to697t.fdu5pffmr0862z8g --discovery-token-ca-cert-hash sha256:15da0d9ac768ad5fe546a2b93ed7516222fa043ef9d5e454a72e1f2ca4870862
这时候回到master
节点服务器,运行下面命令查看节点状态:
kubectl get nodes
如果发现
root@ubuntu1:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
ubuntu1 Ready master 73m v1.13.2
ubuntu2 NotReady <none> 11m v1.13.2
ubuntu3 NotReady <none> 32s v1.13.2
可以在NotReady
节点用:
journalctl -f -u kubelet
查看原因,有时候因为网络不稳定,所以会一直重试。
如果我们忘记了Master节点的加入token,可以使用如下命令来查看:
kubeadm token list
默认情况下,token的有效期是24小时,如果我们的token已经过期的话,可以使用以下命令重新生成:
kubeadm token create
如果我们也没有–discovery-token-ca-cert-hash
的值,可以使用以下命令生成:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
这样集群就搭好了,接下来我们来使用。
k8s使用
我们进入实践篇。可学习k8s文档。
1.获取命名空间下的POD
:
kubectl get pod -n kube-system
2.获取所有命名空间下的POD
:
kubectl get pods --all-namespaces
3.查看POD
日志:
kubectl logs -f --tail=20 kubernetes-dashboard-57df4db6b-m9zbq -n kube-system
查看命名空间kube-system
下的kubernetes-dashboard-57df4db6b-m9zbq
日志。
4.查看命名空间下的服务:
kubectl get svc -n kube-system
此篇参考: 俊先生的文章