如何在Ubuntu 18上安装Kubernetes?
学习如何在Ubuntu上安装Kubernetes。
Kubernetes是由Google开发的开源容器编排工具。在本文中,您将学习如何设置带有主节点和工作节点的Kubernetes。请确保在主节点和工作节点上都安装了Docker installed。
环境详细信息和设置
为了演示,我有2个Ubuntu系统,一个将作为主节点,另一个将作为工作节点。两个服务器的配置如下。
- 2个CPU
- 主节点 – 4 GB RAM / 工作节点 – 2 GB RAM
- 10 GB硬盘
在两个系统上使用hostnamectl
命令设置主机名。
在主节点上:
yaoweibin@yaoweibin:~$ sudo hostnamectl set-hostname kubernetes-master
在工作节点上:
yaoweibin@yaoweibin:~$ sudo hostnamectl set-hostname kubernetes-worker
因此,下面是两个节点的详细信息。
主节点
- 主机名:kubernetes-master
- IP地址:192.168.0.107
工作节点
- 主机名:kubernetes-worker
- IP地址:192.168.0.108
在两个系统上运行Edit hosts file。
yaoweibin@yaoweibin:~$ sudo gedit /etc/hosts
192.168.0.107 kubernetes-master
192.168.0.109 kubernetes-worker
在开始安装Kubernetes之前,在主节点和工作节点上运行以下命令检查Docker是否正在运行。
yaoweibin@yaoweibin:~$ sudo service docker status
[sudo] password for yaoweibin:
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2019-11-23 15:39:36 EST; 3 weeks 0 days ago
Docs: https://docs.docker.com
Main PID: 8840 (dockerd)
Tasks: 17
Memory: 42.3M
CGroup: /system.slice/docker.service
└─8840 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Nov 23 15:39:35 yaoweibin dockerd[8840]: time="2019-11-23T15:39:35.091941184-05:00" level=warning msg="Your kernel does not support cgrou
Nov 23 15:39:35 yaoweibin dockerd[8840]: time="2019-11-23T15:39:35.093149218-05:00" level=info msg="Loading containers: start."
Nov 23 15:39:35 yaoweibin dockerd[8840]: time="2019-11-23T15:39:35.957842188-05:00" level=info msg="Default bridge (docker0) is assigned
Nov 23 15:39:36 yaoweibin dockerd[8840]: time="2019-11-23T15:39:36.078753190-05:00" level=info msg="Loading containers: done."
Nov 23 15:39:36 yaoweibin dockerd[8840]: time="2019-11-23T15:39:36.664727326-05:00" level=info msg="Docker daemon" commit=481bc77 graphdr
Nov 23 15:39:36 yaoweibin dockerd[8840]: time="2019-11-23T15:39:36.817929464-05:00" level=error msg="cluster exited with error: error whi
Nov 23 15:39:36 yaoweibin dockerd[8840]: time="2019-11-23T15:39:36.820439024-05:00" level=error msg="swarm component could not be started
Nov 23 15:39:36 yaoweibin dockerd[8840]: time="2019-11-23T15:39:36.820821712-05:00" level=info msg="Daemon has completed initialization"
Nov 23 15:39:36 yaoweibin systemd[1]: Started Docker Application Container Engine.
Nov 23 15:39:36 yaoweibin dockerd[8840]: time="2019-11-23T15:39:36.883382952-05:00" level=info msg="API listen on /home/yaoweibin/docker.sock
lines 1-20/20 (END)
安装Kubernetes
在主节点和工作节点上运行本节中提到的所有命令。
首先,添加Kubernetes软件包存储库密钥。
yaoweibin@kubernetes-master:~$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
[sudo] password for yaoweibin:
OK
运行下面的命令配置Kubernetes软件包存储库。
yaoweibin@kubernetes-master:~$ sudo apt-add-repository “deb http://apt.kubernetes.io/ kubernetes-xenial main”
命中:1 https://download.docker.com/linux/ubuntu bionic InRelease
命中:2 http://ppa.launchpad.net/ansible/ansible/ubuntu cosmic InRelease
获取:3 http://apt.puppetlabs.com bionic InRelease [85.3 kB]
命中:5 http://security.ubuntu.com/ubuntu cosmic-security InRelease
命中:6 http://us.archive.ubuntu.com/ubuntu cosmic InRelease
忽略:7 http://pkg.jenkins.io/debian-stable binary/ InRelease
命中:8 http://us.archive.ubuntu.com/ubuntu cosmic-updates InRelease
命中:9 http://pkg.jenkins.io/debian-stable binary/ Release
命中:10 http://us.archive.ubuntu.com/ubuntu cosmic-backports InRelease
获取:4 https://packages.cloud.google.com/apt kubernetes-xenial InRelease [8,993 B]
获取:11 http://apt.puppetlabs.com bionic/puppet6 amd64 Packages [36.1 kB]
获取:13 https://packages.cloud.google.com/apt kubernetes-xenial/main amd64 Packages [32.2 kB]
已获取 163 kB,共计 3s (49.1 kB/s)
正在读取软件包列表… 完成
在继续之前,请在两个节点上禁用交换空间。
yaoweibin@kubernetes-master:~$ sudo swapoff -a
安装Kubeadm
现在您需要安装kubeadm。
kubeadm是Kubernetes中用于添加节点到Kubernetes集群的工具。
检查kubeadm版本以验证是否已正确安装。
yaoweibin@kubernetes-master:~$ kubeadm version
kubeadm版本:&version.Info{主要版本:“1”,次要版本:“17”,Git版本:“v1.17.0”,Git提交:“70132b0f130acc0bed193d9ba59dd186f0e634cf”,Git树状态:“clean”,构建日期:“2019-12-07T21:17:50Z”,Go版本:“go1.13.4”,编译器:“gc”,平台:“linux/amd64”}
初始化Kubernetes集群
现在,在主节点上运行init命令,仅初始化Kubernetes集群。使用--apiserver-advertise-address
命令告知工作节点关于主节点的IP地址。
yaoweibin@kubernetes-master:~$ sudo kubeadm init –apiserver-advertise-address=192.168.0.107 –pod-network-cidr=10.244.0.0/16
W1217 11:05:15.474854 10193 validation.go:28] 无法验证kube-proxy配置-没有可用的验证器
W1217 11:05:15.474935 10193 validation.go:28] 无法验证kubelet配置-没有可用的验证器
[init] 使用Kubernetes版本:v1.17.0
[preflight] 运行预检查
[WARNING IsDockerSystemdCheck]: 检测到”Docker cgroup”驱动程序为”cgroupfs”。建议使用”systemd”驱动程序。请按照指南https://kubernetes.io/docs/setup/cri/进行操作。
[preflight] 拉取设置Kubernetes集群所需的镜像
[preflight] 这可能需要几分钟,具体取决于您的互联网连接速度
[preflight] 您也可以使用'kubeadm config images pull'提前执行此操作
[kubelet-start] 将标记写入文件”/var/lib/kubelet/kubeadm-flags.env”
[kubelet-start] 将kubelet配置写入文件”/var/lib/kubelet/config.yaml”
[kubelet-start] 启动kubelet
[certs] 使用证书目录”/etc/kubernetes/pki”
[certs] 生成”ca”证书和密钥
[certs] 生成”apiserver”证书和密钥
[certs] apiserver服务证书为DNS名称[kubernetes-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local]和IP[10.96.0.1 192.168.0.107]签名
[certs] 生成”apiserver-kubelet-client”证书和密钥
[certs] 生成”front-proxy-ca”证书和密钥
[certs] 生成”front-proxy-client”证书和密钥
[certs] 生成”etcd/ca”证书和密钥
[certs] 生成”etcd/server”证书和密钥
[certs] etcd/server服务证书为DNS名称[kubernetes-master localhost]和IP[192.168.0.107 127.0.0.1 ::1]签名
[certs] 生成”etcd/peer”证书和密钥
[certs] etcd/peer服务证书为DNS名称[kubernetes-master localhost]和IP[192.168.0.107 127.0.0.1 ::1]签名
[certs] 生成”etcd/healthcheck-client”证书和密钥
[certs] 生成”apiserver-etcd-client”证书和密钥
[certs] 生成”sa”密钥和公钥
[kubeconfig] 使用kubeconfig目录”/etc/kubernetes”
[kubeconfig] 写入”admin.conf” kubeconfig文件
[kubeconfig] 写入”kubelet.conf” kubeconfig文件
[kubeconfig] 写入”controller-manager.conf” kubeconfig文件
[kubeconfig] 写入”scheduler.conf” kubeconfig文件
[control-plane] 使用清单目录”/etc/kubernetes/manifests”
[control-plane] 为”kube-apiserver”创建静态Pod清单
[control-plane] 为”kube-controller-manager”创建静态Pod清单
W1217 11:05:25.584769 10193 manifests.go:214] 默认kube-apiserver授权模式为”Node,RBAC”;使用”Node,RBAC”
[control-plane] 为”kube-scheduler”创建静态Pod清单
W1217 11:05:25.587128 10193 manifests.go:214] 默认kube-apiserver授权模式为”Node,RBAC”;使用”Node,RBAC”
[etcd] 在”/etc/kubernetes/manifests”中为本地etcd创建静态Pod清单
[wait-control-plane] 等待kubelet从目录”/etc/kubernetes/manifests”中的静态Pod引导控制平面启动。这可能需要多达4m0s
[apiclient] 所有控制平面组件在35.010368秒后都是健康的
[upload-config] 将ConfigMap “kubeadm-config”中使用的配置存储在”kube-system”命名空间中
[kubelet] 在kube-system命名空间中创建ConfigMap “kubelet-config-1.17″,其中包含群集中kubelet的配置
[upload-certs] 跳过阶段。请参阅–upload-certs
[mark-control-plane] 通过添加标签”node-role.kubernetes.io/master=””将节点kubernetes-master标记为控制平面
[mark-control-plane] 通过添加污点[node-role.kubernetes.io/master:NoSchedule]将节点kubernetes-master标记为控制平面
[bootstrap-token] 使用令牌:dmamk9.0nmo62mhom8961qw
[bootstrap-token] 配置引导令牌、cluster-info ConfigMap、RBAC角色
[bootstrap-token] 配置RBAC规则以允许节点引导令牌发布CSRs,以便节点获得长期证书凭据
[bootstrap-token] 配置RBAC规则以允许csrapprover控制器自动批准来自节点引导令牌的CSRs
[bootstrap-token] 配置RBAC规则以允许集群中所有节点客户端证书的证书轮换
[bootstrap-token] 在”kube-public”命名空间中创建”cluster-info” ConfigMap
[kubelet-finalize] 更新”/etc/kubernetes/kubelet.conf”以指向可旋转的kubelet客户端证书和密钥
[addons] 应用基本插件:CoreDNS
[addons] 应用基本插件:kube-proxy
您的Kubernetes控制平面已成功初始化!
要开始使用您的集群,您需要以普通用户身份运行以下命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
接下来,您需要在集群上部署一个Pod网络。
运行kubectl apply -f [podnetwork].yaml
其中之一的选项,选项列表在https://kubernetes.io/docs/concepts/cluster-administration/addons/上列出。
然后,您可以通过在每个工作节点上以root身份运行以下命令加入任意数量的工作节点:
kubeadm join 192.168.0.107:6443 --token dmamk9.0nmo62mhom8961qw --discovery-token-ca-cert-hash sha256:2de92f42e84d2020d8b19b1778785df5f8196e5eedaa5664ad911e8c23f58963
如上面的输出中所述,创建.kube目录并将admin.conf文件复制到.kube目录中的config文件中。
yaoweibin@kubernetes-master:~$ mkdir -p $HOME/.kube
yaoweibin@kubernetes-master:~$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
yaoweibin@kubernetes-master:~$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
此时,当您运行kubectl get nodes
命令时,您将看到主节点的状态为NotReady。
yaoweibin@kubernetes-master:~$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubernetes-master NotReady master 2m34s v1.17.0
部署Pod网络 – Flannel
接下来,您需要在主节点上部署一个Pod网络。我正在使用Flannel Pod网络。它用于在Kubernetes集群中的节点之间进行通信。
yaoweibin@kubernetes-master:~$ sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created
daemonset.apps/kube-flannel-ds-s390x created
检查主节点的状态,它必须处于Ready状态。
yaoweibin@kubernetes-master:~$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubernetes-master Ready master 4m41s v1.17.0
几秒钟后,检查所有Pod是否都已启动并运行。
yaoweibin@kubernetes-master:~$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6955765f44-rzw9d 1/1 Running 0 4m17s
kube-system coredns-6955765f44-xvgdp 1/1 Running 0 4m17s
kube-system etcd-kubernetes-master 1/1 Running 0 4m27s
kube-system kube-apiserver-kubernetes-master 1/1 Running 0 4m27s
kube-system kube-controller-manager-kubernetes-master 1/1 Running 0 4m27s
kube-system kube-flannel-ds-amd64-c2rf5 1/1 Running 0 81s
kube-system kube-proxy-mvdd7 1/1 Running 0 4m17s
kube-system kube-scheduler-kubernetes-master 1/1 Running 0 4m27s
将工作节点添加到集群中
现在,您的主节点已正确配置并运行,是时候添加工作节点了。在这里,您需要在工作节点上运行连接命令,该命令是在初始化kubeadm
后获得的。
在工作节点上运行以下命令以加入主节点。
yaoweibin@kubernetes-worker:~$ sudo kubeadm join 192.168.0.107:6443 –token dmamk9.0nmo62mhom8961qw –discovery-token-ca-cert-hash sha256:2de92f42e84d2020d8b19b1778785df5f8196e5eedaa5664ad911e8c23f58963
[sudo]密码为yaoweibin:
W1217 11:08:01.066191 28968 join.go:346] [preflight]警告:当未设置控制平面标志时,JoinControlPane.controlPlane设置将被忽略。
[预检]运行预检查
[警告IsDockerSystemdCheck]:检测到”Docker cgroupfs”作为Docker cgroup驱动程序。推荐的驱动程序是”systemd”。请按照https://kubernetes.io/docs/setup/cri/上的指南执行操作。
[预检]从集群读取配置…
[预检]提示:您可以使用'kubectl -n kube-system get cm kubeadm-config -oyaml'命令查看此配置文件
[kubelet-start]从”kube-system”命名空间中的”kubelet-config-1.17″ConfigMap下载kubelet的配置
[kubelet-start]将kubelet配置写入文件”/var/lib/kubelet/config.yaml”
[kubelet-start]使用标志将kubelet环境文件写入文件”/var/lib/kubelet/kubeadm-flags.env”
[kubelet-start]启动kubelet
[kubelet-start]等待kubelet执行TLS引导…
此节点已加入集群:
*已向apiserver发送了证书签名请求并收到响应。
*已通知Kubelet有关新的安全连接详细信息。
在控制平面上运行'kubectl get nodes'以查看此节点加入集群。
在主节点上:
在工作节点加入集群后,您现在将看到有几个其他的Pod正在运行。
yaoweibin@kubernetes-master:~$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6955765f44-9c7jc 1/1 Running 0 5m3s
kube-system coredns-6955765f44-c9s9r 1/1 Running 0 5m3s
kube-system etcd-kubernetes-master 1/1 Running 0 5m12s
kube-system kube-apiserver-kubernetes-master 1/1 Running 0 5m12s
kube-system kube-controller-manager-kubernetes-master 1/1 Running 0 5m13s
kube-system kube-flannel-ds-amd64-lgr62 1/1 Running 0 3m35s
kube-system kube-flannel-ds-amd64-n6vwm 1/1 Running 0 27s
kube-system kube-proxy-9mqp6 1/1 Running 0 27s
kube-system kube-proxy-kwkz2 1/1 Running 0 5m3s
kube-system kube-scheduler-kubernetes-master 1/1 Running 0 5m13s
现在,在主节点上再次运行kubectl
命令,检查工作节点是否已加入集群并处于就绪状态。
yaoweibin@kubernetes-master:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubernetes-master Ready master 5m27s v1.17.0
kubernetes-worker Ready 31s v1.17.0
结论
现在,Kubernetes设置已准备就绪,您可以开始在Kubernetes集群上进行容器编排。如果您对Kubernetes的事物感到兴奋,您可以通过参加此Udemy course来学习。