使用Weave Net CNI在Ubuntu 18.04上设置3节点Kubernetes集群

时间:2020-02-23 14:31:38  来源:igfitidea点击:

在本教程中,我将引导我们完成在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 kubeadmKubernetes主要组件:

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)