Kubernetes 是一套可以自动部署和管理容器的系统。本文介绍其安装以及基于 Docker 容器的配置。

0. 事前准备

Kubernetes 使用的是主从框架 (master-slave architecture),一个集群需包含至少 1 个master和 1 个slave。本文采取 1 个 master 和 2 个 slave 作为范例。范例操作系统为 Ubuntu 18.04 x64.

他们的 IP 地址如下。

10.0.0.1 master
10.0.0.2 worker1
10.0.0.3 worker2

以下设定步骤在 3 台机上都执行。

0.1. 编辑 /etc/hosts 文件,加入上述地址

0.2. 安装 Docker

此处摘取 Docker 官方安装教程

#安装必要软件包
apt-get update
apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# 加入 Docker 源
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -	
 add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
# 安装 Docker
apt-get install -y docker-ce docker-ce-cli containerd.io   

此时还需要配置一个用于测试的 Docker 镜像,如 Python SimpleHTTPServer,Flask,或 Docker HelloWorld

0.3. 安装 Kubernetes

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl

1. 配置 Master

在 Master 机上执行以下步骤。

1.1. 选取网络模型

Kubenetes 支持多种网络模型。需先根据自己需求选择一种,因为在初始化 Master 的时候需要输入相关参数。

本文选用 Calico,没有特别的原因,只因为它是 Kubenetes 第一个选项。

1.2. 初始化 Master

# CIDR 与 1.1 选用的网络模型相关
kubeadm init --pod-network-cidr=192.168.0.0/16

以上命令执行成功会出现类似下面的提示,需要记录下 join 的参数,以便 slave 加入集群。

 ...
You can now join any number of machines by running the following on each node
as root:

  kubeadm join : --token  --discovery-token-ca-cert-hash sha256:

1.3. 安装网络模型

同样,这个和 1.1 的选择相关

 kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml

1.4. 复制配置文件供 kubectl 使用

Kubectl 是用来管理 Kubernetes 集群的命令行软件。

执行以下指令后即可使用。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

2. 配置 Slave

在每个 Slave 节点执行以下步骤

2.1. 加入集群

使用步骤 1.2 输出的 join 命令加入集群。

kubeadm join : --token  --discovery-token-ca-cert-hash sha256:

3. 验证集群

在 Master 上执行以下指令验证集群节点

kubectl get node

期待输出

NAME      STATUS   ROLES    AGE    VERSION
master    Ready    master   7d7h   v1.18.2
worker1   Ready       7d7h   v1.18.2
worker2   Ready       7d7h   v1.18.2

4. 部署 Docker 容器以及开启服务

Kubernets 的部署 (Deployment)是用于设定网络模型以及 Docker 容器份数。服务 (Services) 用于暴露容器给外部,如让外部访问容器的网络服务。

Kubernets 的配置文件使用 YAML 格式。

4.1.1. 部署范例

假设该文件名为 urlshortener-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: urlshortener
spec:
  replicas: 3
  selector:
    matchLabels:
      app: urlshortener
  template:
    metadata:
      labels:
        app: urlshortener
    spec:
      containers:
      - name: urlshortener
        image: urlshortener:latest
        imagePullPolicy: Never
        ports:
        - containerPort: 5000

其中,replicas: 指定部署的份数,containerPort: 指定容器的访问端口。image: 指定 Docker 镜像,如果该 Docker 镜像是自定义,需使用 imagePullPolicy: Never

4.1.2. 应用该配置文件

kubectl apply -f urlshortener-deployment.yaml

4.1.3. 验证部署情况

kubectl get all

期望输出:

pod/urlshortener-7d596dcc48-qwkdb   1/1     Running   0          1m
pod/urlshortener-7d596dcc48-z2d5l   1/1     Running   0          1m
pod/urlshortener-7d596dcc48-zv2pm   1/1     Running   0          1m

当然也可以在 Slave 节点中执行以下指令来看容器部署情况

docker ps

4.2.1. 服务范例

假设文件为 urlshortener-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: urlshortener-service
spec:
  selector:
    app: urlshortener
  ports:
  - protocol: "TCP"
    port: 5000
    targetPort: 5000
  type: LoadBalancer
  externalIPs:
  - 10.0.0.1

范例创建一个负载均衡服务,其中,selector: 选择应用程序,名字需与 4.1.1 保持一致。port: 为外部端口,targetPort: 为容器端口。由于本文没有使用第三方负载均衡器(如aws, azure等),需使用 externalIPs: 指定提供服务的 IP 地址,此处选用 Master 的 IP。

4.2.2. 应用该配置文件

kubectl apply -f urlshortener-service.yaml

4.2.3. 验证部署情况

kubectl get all

期望输出:

NAME                           TYPE           CLUSTER-IP     EXTERNAL-IP       PORT(S)          AGE
service/urlshortener-service   LoadBalancer   10.99.86.238   10.0.0.1   5000:30570/TCP   1m

此时在外部访问 10.0.0.1:5000 即可访问容器的相应网络服务。

后记

教程到这里就结束了,成功搭建了有 1 个 master 和 2 个 slave 的集群,并且提供了 Deployment 和 Service 的范例,更多内容需要自行发掘。

kubernetes 可以很方便的扩容和管理容器,以下记录一些常用命令。

# 更改部署份数,可以方便的增加和减少网络服务容器
kubectl scale --replicas=5 deployment urlshortener
# 移除配置,可输入名字或 yaml 文件
kubectl delete
   

已有 1 條評論

  1. 鹿小草 6 年前 (2020-05-11)
    @

    好的