使用Weave Net CNI在Ubuntu 18.04上设置3节点Kubernetes集群
在本教程中,我将引导我们完成在Ubuntu 18.04 Bionic Beaver Linux上安装和设置可正常运行的3节点Kubernetes集群的步骤。
Kubernetes是一个开源容器编排系统,用于自动化容器化应用程序的部署,管理和扩展。
Ubuntu 18.04上的Kubernetes –系统图
让我们先配置系统主机名,然后再继续以下步骤:
在主节点上:设置主机名,如下所示:
$sudo hostnamectl set-hostname k8s-master
在工作节点01上:使用以下命令设置主机名 hostamectl
命令行工具。
$sudo hostnamectl set-hostname k8s-node-01
在工作节点02上,还要为Kubernetes工作节点02设置主机名。
$sudo hostnamectl set-hostname k8s-node-02
在每个主机上配置了正确的主机名后,请在每个节点上填充配置的值。
$cat /etc/hosts 192.168.2.2 k8s-master 192.168.2.3 k8s-node-01 192.168.2.4 k8s-node-02
在Ubuntu 18.04上设置Kubernetes –前提条件(在所有节点上运行)
在进行任何Kubernetes特定配置之前,请确保满足所有要求。
这里我们将进行系统更新并创建Kubernetes用户,将系统软件包更新为所有节点上的最新版本:
sudo apt-get update sudo apt-get upgrade sudo apt-get install linux-image-extra-virtual sudo reboot
添加用户以管理Kubernetes集群:
sudo useradd -s /bin/bash -m k8s-admin sudo passwd k8s-admin sudo usermod -aG sudo k8s-admin echo "k8s-admin ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/k8s-admin
如果我们希望在运行sudo命令时输入sudo密码,例如 k8s-admin
用户,则可以忽略最后一行。
我们可以测试sudo是否没有密码提示:
$su - k8s-admin Hyman@theitroad:~$sudo su Hyman@theitroad:~#
一切看起来不错,让我们继续安装Docker引擎。
在Ubuntu 18.04上设置Kubernetes –安装Docker Engine
Kubernetes要求docker运行用于托管应用程序和其他Kubernetes服务的容器。
我们有完整的Docker安装教程:如何在Ubuntu/Debian/Fedora/Arch/CentOS上安装Docker CE如果需要快速安装教程,请使用以下命令在Ubuntu 18.04上安装Docker Engine。
确保系统上已卸载任何旧版本的Docker引擎:
sudo apt-get remove docker docker-engine docker.i
安装依赖项:
$sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
导入Docker仓库GPG密钥:
$curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add $sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
安装docker:
sudo apt-get update sudo apt-get install docker-ce sudo usermod -aG docker k8s-admin
安装docker后,我们可以继续配置Kubernetes主节点。
在Ubuntu 18.04上设置Kubernetes –安装和配置Kubernetes Master
本节将执行的所有命令均应在主节点上运行。
不要在Kubernetes工作者节点上执行任何命令。
Kubernetes Master组件提供了群集的控制平面-API服务器,调度程序,控制器管理器。
他们做出有关群集的全局决策,例如调度,检测和响应群集事件。
添加Kubernetes存储库
在撰写本文时,还没有Ubuntu 18.04的官方存储库,我们将为Ubuntu 16.04添加一个存储库。
我测试了所有软件包和依赖项都应安装良好。
当提供适用于Ubuntu 18.04的存储库时,我将更新本文。
# cat <<EOF > /etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/kubernetes-xenial main EOF
然后导入GPG密钥:
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
更新apt软件包索引:
sudo apt update
安装Kubernetes Master组件
安装kubectl, kubelet, kubernetes-cni and kubeadm
Kubernetes主要组件:
sudo apt install kubectl kubelet kubeadm kubernetes-cni
确认所有软件包二进制文件都存在于文件系统上。
$which kubelet /usr/bin/kubelet $which kubeadm /usr/bin/kubeadm
如果交换功能已打开,请将其关闭。
sudo swapoff -a
初始化Kubernetes集群:
安装完所有Kubernetes软件包后,我们就可以使用来初始化集群了 kubeadm
命令行工具。
导出必需的变量(可选)
export API_ADDR=`ifconfig eth0 | grep 'inet'| cut -d':' -f2 | awk '{print }'` export DNS_DOMAIN="k8s.local" export POD_NET="10.4.0.0/16" export SRV_NET="10.5.0.0/16"
然后使用上面定义的变量初始化Kubernetes集群:
kubeadm init --pod-network-cidr ${POD_NET} --service-cidr ${SRV_NET} \ --service-dns-domain "${DNS_DOMAIN}" --apiserver-advertise-address ${API_ADDR}
如果一切顺利,我们将收到一条成功消息,其中包含下一步操作的说明:
-- 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.2.2:6443 --token 9y4vc8.h7jdjle1xdovrd0z --discovery-token-ca-cert-hash sha256:cff9d1444a56b24b4a8839ff3330ab7177065c90753ef3e4e614566695db273c
配置访问权限 k8s-admin
主服务器上的用户
切换到 k8s-admin
并复制带有集群信息的Kubernetes配置文件。
su - k8s-admin mkdir -p $HOME/.k8s sudo cp -i /etc/kubernetes/admin.conf $HOME/.k8s/config sudo chown $(id -u):$(id -g) $HOME/.k8s/config export KUBECONFIG=$HOME/.k8s/config echo "export KUBECONFIG=$HOME/.k8s/config" | tee -a ~/.bashrc
将Weave Net POD网络部署到群集(以普通用户身份运行)
Weave Net创建了一个虚拟网络,该虚拟网络将Docker容器跨多个主机连接起来并启用它们的自动发现功能。
无论运行在何处,Weave网络上的应用程序容器提供的服务都可以暴露给外界.Weave Net可以通过一个命令安装到启用CNI的Kubernetes集群上:
# su - k8s-admin $kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" serviceaccount/weave-net created clusterrole.rbac.authorization.k8s.io/weave-net created clusterrolebinding.rbac.authorization.k8s.io/weave-net created role.rbac.authorization.k8s.io/weave-net created rolebinding.rbac.authorization.k8s.io/weave-net created daemonset.extensions/weave-net created
几秒钟后,一个Weave Net Pod应该在每个节点上运行,并且我们创建的任何其他Pod将自动连接到Weave网络。
Hyman@theitroad:~$kubectl get pod -n kube-system | grep weav weave-net-d9v5v 2/2 Running 0 11h weave-net-mhp46 2/2 Running 0 11h weave-net-vmksr 2/2 Running 0 11h
设置Kubernetes Worker节点
当Kubernetes集群已经初始化并且主节点处于联机状态时,启动Worker Nodes配置。
节点是Kubernetes中的工作机,它可以是VM或者物理机。
每个节点都由主节点管理,并具有运行Pod所需的服务-docker,kubelet,kube-proxy
步骤1:确保已安装Docker(已发现)
确保在所有Worker节点上都安装了docker引擎。
请参阅docker安装部分
步骤2:添加Kubernetes存储库(已涵盖)
确保将Kubenetes软件包的存储库添加到系统中。
请参阅^^
步骤3:安装Kubenetes组件
添加Kubernetes存储库后,请使用以下步骤安装组件:
sudo apt install kubelet kubeadm kubectl kubernetes-cni
步骤4:将节点加入群集:
使用初始化Kubernetes集群后给出的join命令。
例如
kubeadm join 192.168.2.2:6443 --token 9y4vc8.h7jdjle1xdovrd0z \ --discovery-token-ca-cert-hash sha256:cff9d1444a56b24b4a8839ff3330ab7177065c90753ef3e4e614566695db273c -- [tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap... [patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "k8s-node-02" as an annotation This node has joined the cluster: * Certificate signing request was sent to master and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the master to see this node join the cluster.
完成后,检查主节点上的节点状态:
Hyman@theitroad:~$kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready master 35m v1.11.0 k8s-node-01 Ready <none> 2m v1.11.0 k8s-node-02 Ready <none> 1m v1.11.0
在两个节点上,应配置Weave Net。
Hyman@theitroad:~# ip ad | grep weave 6: weave: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UP group default qlen 1000 inet 10.44.0.0/12 brd 10.47.255.255 scope global weave 9: Hyman@theitroad: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master weave state UP group default Hyman@theitroad:~# ip ad | grep weave 6: weave: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UP group default qlen 1000 inet 10.47.0.0/12 brd 10.47.255.255 scope global weave 9: Hyman@theitroad: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master weave state UP group default
测试Kubernetes部署
让我们创建测试容器,以确认我们的集群正在按预期运行。
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: http-app spec: replicas: 3 template: metadata: labels: app: http-app spec: containers: - name: http-app image: katacoda/docker-http-server:latest ports: - containerPort: 80
部署到集群
创建一个测试名称空间:
$kubectl create namespace test-namespace namespace/test-namespace created
创建名称空间后,使用先前定义的部署对象创建一个Pod。
-n用于指定名称空间。
我们希望自我们建立起三个豆荚 replicas
值是3.
$kubectl create -n test-namespace -f http-app-deployment.yml deployment.extensions/http-app created
确认:
$kubectl -n test-namespace get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE http-app 3 3 3 3 1m $kubectl -n test-namespace get pods NAME READY STATUS RESTARTS AGE http-app-97f76fcd8-68pxg 1/1 Running 0 1m http-app-97f76fcd8-f9bdk 1/1 Running 0 1m http-app-97f76fcd8-vgmq7 1/1 Running 0 1m
你可以看到我们有 http-app
实时部署:创建部署后,我们可以使用kubectl来创建将Pod暴露在特定端口上的服务。
另一种方法是使用YAML定义Service对象。
以下是我们的服务定义。
$cat http-app-service.yml apiVersion: v1 kind: Service metadata: name: http-app-svc labels: app: http-app spec: type: NodePort ports: - port: 80 nodePort: 30080 selector: app: http-app
使用创建服务 kubectl
命令:
$kubectl -n test-namespace create -f http-app-service.yml service/http-app-svc created
该服务将在群集IP和端口30080上可用。
要获取群集IP,请使用:
$kubectl -n test-namespace get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE http-app-svc NodePort 10.5.45.208 <none> 80:30080/TCP 1m
Ubuntu 18.04上的Kubernetes –安装后
为kubectl命令启用shell自动补全功能。
kubectl包含自动完成功能支持,可以节省大量输入!要在当前会话中启用shell程序完成,请运行:
source <(kubectl completion bash)
要将kubectl自动完成功能添加到配置文件中,以便在以后的shell中自动加载它,请运行:
echo "source <(kubectl completion bash)" >> ~/.bashrc
如果我们使用的是zsh,请编辑~/.zshrc文件,并添加以下代码以启用kubectl自动补全功能:
if [ $commands[kubectl] ]; then source <(kubectl completion zsh) fi
或者,当使用Oh-My-Zsh时,请编辑 ~/.zshrc
文件并更新plugins =行以包含kubectl插件。
source <(kubectl completion zsh)