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 官方安装教程。
1 2 3 4 5 6 7 8 9 10 11 |
#安装必要软件包 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
1 2 3 4 |
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
1 2 |
# CIDR 与 1.1 选用的网络模型相关 kubeadm init --pod-network-cidr=192.168.0.0/16 |
以上命令执行成功会出现类似下面的提示,需要记录下 join 的参数,以便 slave 加入集群。
1 2 3 4 5 |
... 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 的选择相关
1 |
kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml |
1.4. 复制配置文件供 kubectl 使用
Kubectl 是用来管理 Kubernetes 集群的命令行软件。
执行以下指令后即可使用。
1 2 3 |
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 命令加入集群。
1 |
kubeadm join : --token --discovery-token-ca-cert-hash sha256: |
3. 验证集群
在 Master 上执行以下指令验证集群节点
1 |
kubectl get node |
期待输出
1 2 3 4 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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. 应用该配置文件
1 |
kubectl apply -f urlshortener-deployment.yaml |
4.1.3. 验证部署情况
1 |
kubectl get all |
期望输出:
1 2 3 |
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 节点中执行以下指令来看容器部署情况
1 |
docker ps |
4.2.1. 服务范例
假设文件为 urlshortener-service.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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. 应用该配置文件
1 |
kubectl apply -f urlshortener-service.yaml |
4.2.3. 验证部署情况
1 |
kubectl get all |
期望输出:
1 2 |
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 可以很方便的扩容和管理容器,以下记录一些常用命令。
1 2 3 4 |
# 更改部署份数,可以方便的增加和减少网络服务容器 kubectl scale --replicas=5 deployment urlshortener # 移除配置,可输入名字或 yaml 文件 kubectl delete |
好的