kubernetes 二进制方式集群搭建

在 K8S 学习之前,集群搭建部分也能难倒一大片童鞋,这里采用二进制方式安装 Kubernetes 集群,难点是所有的步骤都要一步步走一遍,并且还易出错,但是同时好处是会对 K8S 的认识有一个整体的、更加深刻的理解。

搭建前准备工作

机器准备

机器 模式 节点名称
192.168.6.128 Master k8s-master
192.168.6.129 Node k8s-node1
192.168.6.130 Node k8s-node2

节点的组件分配

主节点和 Node 节点分别要部署哪些组件,这里做个列举,后续在集群搭建过程中也都会一一讲到。

  • Master:etcd,kube-apiserver,kube-controller-manager,kube-scheduler,kubelet

  • Node:kubelet、docker、kube_proxy

修改主机名与 IP 映射关系

需要在 3 台机器上分别执行以下命令操作,修改主机名与 IP 之间的映射关系

  1. $ sudo vim /etc/hosts
  2. 192.168.6.128 k8s-master
  3. 192.168.6.129 k8s-node1
  4. 192.168.6.130 k8s-node2

安装 Docker

需要在每台机器上安装 Docker,对 Docker 不熟悉的可参考之前写的文章 Docker 入门到实践 中间有详细介绍对 Docker 的安装

K8S 证书和密钥创建

在网络通信中会存在一些不可信任的操作,例如信息可能会被第三方窃取、篡改。创建证书和密钥也是为了防范这种事情的发生,防止他人轻易入侵你的集群。对于网络安全业内也有一些成熟的方案,例如 对称与非对称SSL/TLS 等。

这也是我们迈向集群搭建的第一步,先创建好各组件需要的证书和密钥

安装 CFSSL

通过 CFSSL https://github.com/cloudflare/cfssl 工具来生成 TLS 证书和密钥,这个需要在所有节点安装

  1. # 下载
  2. $ wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 \
  3. https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 \
  4. https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
  5. # 修改权限
  6. $ chmod +x cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64
  7. # 移动至 bin 目录
  8. $ sudo mv cfssl_linux-amd64 /usr/local/bin/cfssl
  9. $ sudo mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
  10. $ sudo mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo

验证安装是否成功

  1. $ cfssl version
  2. Version: 1.2.0
  3. Revision: dev
  4. Runtime: go1.6

创建 CA 证书

创建 CA 配置文件、证书签名密钥,需要理解这里的根证书 CA 用来签名后续创建的其它证书(kubernetes、admin、kube-proxy…)

创建 CA 配置文件

  1. # 创建证书存放目录
  2. $ sudo mkdir /usr/src/kubernetes/ca
  3. cd /usr/src/kubernetes/ca
  4. cfssl print-defaults config > config.json
  5. cfssl print-defaults csr > csr.json
  6. cat > ca-config.json <<EOF
  7. {
  8. "signing": {
  9. "default": {
  10. "expiry": "87600h"
  11. },
  12. "profiles": {
  13. "kubernetes": {
  14. "usages": [
  15. "signing",
  16. "key encipherment",
  17. "server auth",
  18. "client auth"
  19. ],
  20. "expiry": "87600h"
  21. }
  22. }
  23. }
  24. }
  25. EOF

创建 CA 证书签名

  1. cat > ca-csr.json <<EOF
  2. {
  3. "CN": "kubernetes",
  4. "key": {
  5. "algo": "rsa",
  6. "size": 2048
  7. },
  8. "names": [
  9. {
  10. "C": "CN",
  11. "ST": "ShangHai",
  12. "L": "ShangHai",
  13. "O": "k8s",
  14. "OU": "System"
  15. }
  16. ],
  17. "ca": {
  18. "expiry": "87600h"
  19. }
  20. }
  21. EOF

生成 CA 证书和密钥

此时就会多出两个文件 ca-key.pem ca.pem 分别为新生成的密钥和证书

  1. $ cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  2. $ ls
  3. ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem config.json csr.json

创建 kubectl 管理员证书

kubectl 相当于系统管理,因此以下使用 admin 命名

  1. # kubectl 证书存放目录
  2. $ sudo mkdir /usr/src/kubernetes/ca/admin
  3. # 创建 admin 证书签名存放文件
  4. $ sudo vim admin-csr.json
  5. {
  6. "CN": "admin",
  7. "hosts": [],
  8. "key": {
  9. "algo": "rsa",
  10. "size": 2048
  11. },
  12. "names": [
  13. {
  14. "C": "CN",
  15. "ST": "ShangHai",
  16. "L": "ShangHai",
  17. "O": "system:masters",
  18. "OU": "System"
  19. }
  20. ]
  21. }

生成 admin 证书和密钥

使用根证书(ca.pem、ca-key.pem)签发 admin 证书

  1. $ cfssl gencert \
  2. -ca=/usr/src/kubernetes/ca/ca.pem \
  3. -ca-key=/usr/src/kubernetes/ca/ca-key.pem \
  4. -config=/usr/src/kubernetes/ca/ca-config.json \
  5. -profile=kubernetes admin-csr.json | cfssljson -bare admin
  6. $ ls
  7. admin.csr admin-csr.json admin-key.pem admin.pem

创建 ETCD 证书

  1. # etcd 证书存放目录
  2. $ sudo mkdir /usr/src/kubernetes/ca/etcd
  3. # 创建 etcd 证书签名存放文件
  4. $ sudo vim etcd-csr.json
  5. {
  6. "CN":"etcd",
  7. "hosts":[
  8. "127.0.0.1",
  9. "192.168.6.128",
  10. "192.168.6.129",
  11. "192.168.6.130"
  12. ],
  13. "key":{
  14. "algo":"rsa",
  15. "size":2048
  16. },
  17. "names":[
  18. {
  19. "C":"CN",
  20. "ST":"ShangHai",
  21. "L":"ShangHai",
  22. "O":"k8s"
  23. }
  24. ]
  25. }

生成 etcd 证书和密钥

使用根证书(ca.pem、ca-key.pem)签发 etcd 证书

  1. $ cfssl gencert \
  2. -ca=/usr/src/kubernetes/ca/ca.pem \
  3. -ca-key=/usr/src/kubernetes/ca/ca-key.pem \
  4. -config=/usr/src/kubernetes/ca/ca-config.json \
  5. -profile=kubernetes etcd-csr.json | cfssljson -bare etcd
  6. $ ls
  7. etcd.csr etcd-csr.json etcd-key.pem etcd.pem

创建 API-Server(kubernetes) 证书

kubernetes 集群的所有操作都是基于 kube-apiserver 这个组件进行的,显然这个也是核心,查资料大多数都是放在 kubernetes 目录下,你也可以自己定义名字,例如 api-server

  1. # kubernetes 证书存放目录
  2. $ sudo mkdir /usr/src/kubernetes/ca/kubernetes
  3. # 创建 kubernetes 证书签名存放文件
  4. $ sudo vim kubernetes-csr.json
  5. {
  6. "CN": "kubernetes",
  7. "hosts": [
  8. "127.0.0.1",
  9. "192.168.6.128",
  10. "192.168.6.129",
  11. "192.168.6.130",
  12. "kubernetes"
  13. ],
  14. "key": {
  15. "algo": "rsa",
  16. "size": 2048
  17. },
  18. "names": [
  19. {
  20. "C": "CN",
  21. "ST": "ShangHai",
  22. "L": "ShangHai",
  23. "O": "k8s",
  24. "OU": "System"
  25. }
  26. ]
  27. }

生成 kubernetes 证书和密钥

使用根证书(ca.pem、ca-key.pem)签发 kubernetes 证书

  1. $ cfssl gencert \
  2. -ca=/usr/src/kubernetes/ca/ca.pem \
  3. -ca-key=/usr/src/kubernetes/ca/ca-key.pem \
  4. -config=/usr/src/kubernetes/ca/ca-config.json \
  5. -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
  6. $ ls
  7. kubernetes.csr kubernetes-csr.json kubernetes-key.pem kubernetes.pem

创建 calico 证书

  1. # calico 证书存放目录
  2. $ mkdir /usr/src/kubernetes/ca/calico
  3. # 创建 calico 证书签名存放文件
  4. $ vim calico-csr.json
  5. {
  6. "CN": "calico",
  7. "hosts": [],
  8. "key": {
  9. "algo": "rsa",
  10. "size": 2048
  11. },
  12. "names": [
  13. {
  14. "C": "CN",
  15. "ST": "ShangHai",
  16. "L": "XS",
  17. "O": "k8s",
  18. "OU": "System"
  19. }
  20. ]
  21. }

生成 calico 证书和密钥

使用根证书(ca.pem、ca-key.pem)签发 calico 证书

  1. $ cfssl gencert \
  2. -ca=/usr/src/kubernetes/ca/ca.pem \
  3. -ca-key=/usr/src/kubernetes/ca/ca-key.pem \
  4. -config=/usr/src/kubernetes/ca/ca-config.json \
  5. -profile=kubernetes calico-csr.json | cfssljson -bare calico
  6. $ ls
  7. calico.csr calico-csr.json calico-key.pem calico.pem

证书签名同步到其余机器

  1. # 压缩
  2. $ tar -zcvf /usr/src/kubernetes/ca.tar.gz /usr/src/kubernetes/ca
  3. # 同步到 192.168.6.129 机器
  4. $ scp /usr/src/kubernetes/ca.tar.gz 用户名@192.168.6.129:/home/用户名
  5. # 同步到 192.168.6.130 机器
  6. $ scp /usr/src/kubernetes/ca.tar.gz 用户名@192.168.6.130:/home/用户名
  7. # 6.129、6.130 两台机器分别执行如下命令解压文件移动至 /usr/src/kubernetes/ 目录下
  8. $ cd /home/用户名
  9. $ tar -xvf ca.tar.gz
  10. $ mv ca /usr/src/kubernetes/

kubectl 命令行工具部署

选择二进制文件

打开 https://github.com/kubernetes/kubernetes/releases 选择相应的版本。从 “CHANGELOG-1.14.md” 进入二进制文件页,以 v1.14.6 为例,选择 Linux Server 版,如下所示:

kubernetes 二进制方式集群搭建 - 图1

注意,执行以下命令,这里是需要科学上网的,否则将无法下载,本处为大家提供了一个二进制包,可以直接在网盘下载,链接地址:pan.baidu.com

  1. $ wget https://dl.k8s.io/v1.14.6/kubernetes-server-linux-amd64.tar.gz #需要科学上网

部署二进制文件

如果是在百度网盘下载的二进制安装包,需要先通过 scp 命令从本地拷贝到服务器,如下所示:

  1. # 三台机器都要同步
  2. $ scp ${文件路径}/kubernetes-server-linux-amd64.tar.gz 用户名@192.168.6.128:/home/用户名
  3. $ scp ${文件路径}/kubernetes-server-linux-amd64.tar.gz 用户名@192.168.6.129:/home/用户名
  4. $ scp ${文件路径}/kubernetes-server-linux-amd64.tar.gz 用户名@192.168.6.130:/home/用户名

解压二进制安装包

  1. $ tar -xvf kubernetes-server-linux-amd64.tar.gz

解压之后当前目录下会存在 kubernetes 目录,进入 kubernetes/server/bin 目录,看到如下文件列表,就已经解压成功了

kubernetes 二进制方式集群搭建 - 图2

此时,如果不是在系统的环境变量下,输入 kubectl vresion,会报如下错误,因为该命令并没有在全局

  1. $ kubectl
  2. kubectl: command not found

环境变量设置

为了解决上面的问题将 kubernetes 的 bin 设置为全局,如果你是放在 /usr/local/bin 也就不需要做如下设置了

  1. $ sudo vim /etc/profile
  2. # 尾部增加如下命令,把路径替换为自己的
  3. export PATH=$PATH:/home/用户名/kubernetes/server/bin

查看 kubectl 安装版本

  1. $ kubectl version
  2. Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.0", GitCommit:"ddf47ac13c1a9483ea035a79cd7c10005ff21a6d", GitTreeState:"clean", BuildDate:"2018-12-03T21:04:45Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}

复制组件到 bin 目录

通过下面方式不用设置也可实现全局使用 kubectl 命令,另外一定要做这步,后续部署 kube-apiserver、kube-controller-manager、kube-scheduler 是需要的

  1. $ cd kubernetes/server/bin
  2. $ cp kube-scheduler kube-apiserver kube-controller-manager kubectl kubelet kube-proxy /usr/local/bin

创建 kubectl kubeconfig 文件

  1. 设置集群参数
  1. $ kubectl config set-cluster kubernetes \
  2. --certificate-authority=/usr/src/kubernetes/ca/ca.pem \
  3. --embed-certs=true \
  4. --server=https://192.168.6.128:6443
  1. 设置客户端认证参数
  1. $ kubectl config set-credentials admin \
  2. --client-certificate=/usr/src/kubernetes/ca/admin/admin.pem \
  3. --embed-certs=true \
  4. --client-key=/usr/src/kubernetes/ca/admin/admin-key.pem
  1. 设置上下文参数
  1. $ kubectl config set-context kubernetes \
  2. --cluster=kubernetes \
  3. --user=admin
  1. 设置默认上下文
  1. kubectl config use-context kubernetes

经过以上 4 个步骤之后会生成一个 ~/.kube/config 文件,使用 cat ~/.kube/config 命令可查看

ETCD 部署

ETCD 类似于 Consul、ZK,常用于服务发现、注册、配置中心等,kubernetes 使用 ETCD 做为数据中心,用于存储节点信息、组件信息等。生产环境为了保证数据中心高可用,至少为 3 个节点,通常为 3~5 个节点。此处主要用于学习使用,仅建立一个单实例。

下载 ETCD 二进制文件

浏览 https://github.com/etcd-io/etcd/tags 选择更多的二进制版本文件

  1. $ wget https://github.com/etcd-io/etcd/releases/download/v3.3.14/etcd-v3.3.14-linux-amd64.tar.gz
  2. $ tar -xvf etcd-v3.3.14-linux-amd64.tar.gz
  3. $ mv etcd-v3.3.14-linux-amd64/etcd* /usr/local/bin

创建 etcd 的 systemd unit 文件

/lib/systemd/system/ 目录下创建 etcd.service 配置文件,解释一些核心配置参数

  • WorkingDirectory:指定 etcd 的工作目录和数据目录为 /var/lib/etcd/,如果该目录不存在,启动前需先创建
  • EnvironmentFile:指定环境环境变量文件(${ETCD_NAME} 变量设置的文件)
  • —name :指定节点名称(不要重复),当 —initial-cluster-state 值为 new 时, —name 的参数值必须位于 —initial-cluster 列表中;
  • —listen-client-urls:监听的客户端 IP,一个是监听于本机的 127.0.0.1,另一个是监听于当前节点的 192.168.6.128
  • —advertise-client-urls:建议的客户端 url 地址
  • —cert-file:etcd server 与 client 通信时使用的证书
  • —key-file:etcd server 与 client 通信时使用的密钥
  • —peer-cert-file:etcd 与 peer 通信使用的证书
  • —peer-key-file:etcd 与 peer 通信使用的密钥;
  • —trusted-ca-file:签名 client 证书的 CA 证书,用于验证 client 证书
  • —peer-trusted-ca-file :签名 peer 证书的 CA 证书,用于验证 peer 证书;
  • —initial-cluster-state new:决定了 —name 参数值
  • —data-dir:存储数据的地址和 WorkingDirectory 定义的是同一个
  1. [Unit]
  2. Description=Etcd Server
  3. After=network.target
  4. After=network-online.target
  5. Wants=network-online.target
  6. Documentation=https://github.com/coreos
  7. [Service]
  8. Type=notify
  9. WorkingDirectory=/var/lib/etcd/
  10. EnvironmentFile=/etc/etcd/etcd.conf
  11. ExecStart=/usr/local/bin/etcd \
  12. --name ${ETCD_NAME} \
  13. --listen-client-urls ${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
  14. --advertise-client-urls ${ETCD_ADVERTISE_CLIENT_URLS} \
  15. --cert-file=/usr/src/kubernetes/ca/etcd/etcd.pem \
  16. --key-file=/usr/src/kubernetes/ca/etcd/etcd-key.pem \
  17. --peer-cert-file=/usr/src/kubernetes/ca/etcd/etcd.pem \
  18. --peer-key-file=/usr/src/kubernetes/ca/etcd/etcd-key.pem \
  19. --trusted-ca-file=/usr/src/kubernetes/ca/ca.pem \
  20. --peer-trusted-ca-file=/usr/src/kubernetes/ca/ca.pem \
  21. --initial-advertise-peer-urls ${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
  22. --listen-peer-urls ${ETCD_LISTEN_PEER_URLS} \
  23. # 以下注释掉的配置只有在 ETCD 为集群模式下才会使用
  24. #--initial-cluster-token ${ETCD_INITIAL_CLUSTER_TOKEN} \
  25. #--initial-cluster infra1=https://192.168.6.128:2380,infra2=https://192.168.6.129:2380,infra3=https://192.168.6.130:2380 \
  26. #--initial-cluster-state new \
  27. --data-dir=${ETCD_DATA_DIR}
  28. Restart=on-failure
  29. RestartSec=5
  30. LimitNOFILE=65536
  31. [Install]
  32. WantedBy=multi-user.target

设置 ETCD 环境变量文件

  1. $ vim /etc/etcd/etcd.conf
  2. ETCD_NAME=ETCD Server
  3. ETCD_DATA_DIR="/var/lib/etcd"
  4. ETCD_LISTEN_PEER_URLS="https://192.168.6.128:2380"
  5. ETCD_LISTEN_CLIENT_URLS="https://192.168.6.128:2379"
  6. #[cluster]
  7. ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.6.128:2380"
  8. # ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
  9. ETCD_ADVERTISE_CLIENT_URLS="https://192.168.6.128:2379"

启动 ETCD 服务

  1. $ systemctl daemon-reload # 配置更新执行
  2. $ service etcd start
  3. # 查看服务日志
  4. journalctl -f -u etcd.service

验证 ETCD 是否成功

  1. $ ETCDCTL_API=3 etcdctl \
  2. --endpoints=https://192.168.6.128:2379 \
  3. --cacert=/usr/src/kubernetes/ca/ca.pem \
  4. --cert=/usr/src/kubernetes/ca/etcd/etcd.pem \
  5. --key=/usr/src/kubernetes/ca/etcd/etcd-key.pem \
  6. endpoint health

返回以下响应,ETCD 就已经搭建成功了

  1. https://192.168.6.128:2379 is healthy: successfully committed proposal: took = 59.751468ms

Master 三大组件 kube-apiserver 部署

APIServer 负责对外提供 RESTful 的 kubernetes API 的服务,它是系统管理指令的统一接口,任何对资源的增删该查都要交给 APIServer 处理后再交给 etcd。

配置文件

目录 /usr/lib/systemd/system/ 新建配置文件 kube-apiserver.service 配置信息可参考 官方:kube-apiserver 配置详解

生成 Token 认证文件

  1. $ head -c 16 /dev/urandom | od -An -t x | tr -d ' '
  2. 28b965fd841a996434a7a16237e4fa1a
  3. $ echo "28b965fd841a996434a7a16237e4fa1a,kubelet-bootstrap,10001,\"system:kubelet-bootstrap\"" > /usr/src/kubernetes/ca/kubernetes/token.csv

部分配置详解

  • admission-control:控制资源进入集群的准入控制插件的顺序列
  • service-cluster-ip-range:CIDR表示的IP范围
  • service-node-port-range:服务端口范围
  • enable-swagger-ui:在 apiserver 的 /swagger-ui 路径启用 swagger ui
  • allow-privileged:如果为 true, 将允许特权容器
  • audit-log-path:如果设置该值,所有到 apiserver 的请求都将会被记录到这个文件。’-‘表示记录到标准输出
  • kubelet-https:为 kubelet 启用 https(默认值true)
  • bind-address:监听—seure-port的IP地址。被关联的接口必须能够被集群其它节点和CLI/web客户端访问。如果为空,则将使用所有接口(0.0.0.0)。(默认值0.0.0.0)

vim /usr/lib/systemd/system/kube-apiserver.service

  1. [Unit]
  2. Description=Kubernetes API Service
  3. Documentation=https://github.com/GoogleCloudPlatform/kubernetes
  4. After=network.target
  5. After=etcd.service
  6. [Service]
  7. ExecStart=/usr/local/bin/kube-apiserver \
  8. --admission-control=NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \
  9. --bind-address=192.168.6.128 \
  10. --authorization-mode=Node,RBAC \
  11. --runtime-config=api/all \
  12. --enable-bootstrap-token-auth \
  13. --token-auth-file=/usr/src/kubernetes/ca/kubernetes/token.csv \
  14. --service-cluster-ip-range=10.68.0.0/16 \
  15. --service-node-port-range=1-32767 \
  16. --tls-cert-file=/usr/src/kubernetes/ca/kubernetes/kubernetes.pem \
  17. --tls-private-key-file=/usr/src/kubernetes/ca/kubernetes/kubernetes-key.pem \
  18. --client-ca-file=/usr/src/kubernetes/ca/ca.pem \
  19. --kubelet-client-certificate=/usr/src/kubernetes/ca/kubernetes/kubernetes.pem \
  20. --kubelet-https=true \
  21. --kubelet-client-key=/usr/src/kubernetes/ca/kubernetes/kubernetes-key.pem \
  22. --service-account-key-file=/usr/src/kubernetes/ca/ca-key.pem \
  23. --etcd-cafile=/usr/src/kubernetes/ca/ca.pem \
  24. --etcd-certfile=/usr/src/kubernetes/ca/kubernetes/kubernetes.pem \
  25. --etcd-keyfile=/usr/src/kubernetes/ca/kubernetes/kubernetes-key.pem \
  26. --etcd-servers=https://192.168.6.128:2379 \
  27. --enable-swagger-ui=true \
  28. --allow-privileged=true \
  29. --audit-log-maxage=30 \
  30. --audit-log-maxbackup=3 \
  31. --audit-log-maxsize=100 \
  32. --audit-log-path=/var/log/kube-apiserver-audit.log \
  33. --event-ttl=1h \
  34. --v=2
  35. Restart=on-failure
  36. Type=notify
  37. LimitNOFILE=65536
  38. [Install]
  39. WantedBy=multi-user.target

启动 Kube Apiserver 服务

  1. $ cd /usr/lib/systemd/system/
  2. $ systemctl daemon-reload
  3. $ systemctl enable kube-apiserver.service
  4. # 执行以下步骤如果出现启动错误,根据 "systemctl status kube-apiserver.service 或 journalctl -xe 找到 Error 的地方进行排查
  5. $ service kube-apiserver start

检查 Kube Apiserver 服务

  1. $ systemctl status kube-apiserver
  2. kube-apiserver.service - Kubernetes API Service
  3. Loaded: loaded (/usr/lib/systemd/system/kube-apiserver.service; enabled; vendor preset: enabled)
  4. Active: active (running) since Fri 2019-09-20 03:08:26 PDT; 1min 48s ago
  5. Docs: https://github.com/GoogleCloudPlatform/kubernetes
  6. Main PID: 34393 (kube-apiserver)
  7. Tasks: 8
  8. Memory: 194.1M
  9. CPU: 11.863s
  10. CGroup: /system.slice/kube-apiserver.service
  11. └─34393 /usr/local/bin/kube-apiserver --admission-control=NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota --bind-address=192.168.6.128
  12. Sep 20 03:08:29 ubuntu kube-apiserver[34393]: I0920 03:08:29.922993 34393 controller.go:606] quota admission added evaluator for: rolebindings.rbac.authorization.k8s.io
  13. Sep 20 03:08:29 ubuntu kube-apiserver[34393]: I0920 03:08:29.929755 34393 storage_rbac.go:284] created rolebinding.rbac.authorization.k8s.io/system:controller:bootstrap-signer in kube-public
  14. Sep 20 03:08:29 ubuntu kube-apiserver[34393]: I0920 03:08:29.971198 34393 storage_rbac.go:284] created rolebinding.rbac.authorization.k8s.io/system::extension-apiserver-authentication-reader i
  15. Sep 20 03:08:30 ubuntu kube-apiserver[34393]: I0920 03:08:30.014130 34393 storage_rbac.go:284] created rolebinding.rbac.authorization.k8s.io/system::leader-locking-kube-controller-manager in k
  16. Sep 20 03:08:30 ubuntu kube-apiserver[34393]: I0920 03:08:30.049138 34393 storage_rbac.go:284] created rolebinding.rbac.authorization.k8s.io/system::leader-locking-kube-scheduler in kube-syste
  17. Sep 20 03:08:30 ubuntu kube-apiserver[34393]: I0920 03:08:30.094243 34393 storage_rbac.go:284] created rolebinding.rbac.authorization.k8s.io/system:controller:bootstrap-signer in kube-system
  18. Sep 20 03:08:30 ubuntu kube-apiserver[34393]: I0920 03:08:30.130311 34393 storage_rbac.go:284] created rolebinding.rbac.authorization.k8s.io/system:controller:cloud-provider in kube-system
  19. Sep 20 03:08:30 ubuntu kube-apiserver[34393]: I0920 03:08:30.173883 34393 storage_rbac.go:284] created rolebinding.rbac.authorization.k8s.io/system:controller:token-cleaner in kube-system
  20. Sep 20 03:08:30 ubuntu kube-apiserver[34393]: W0920 03:08:30.280703 34393 lease.go:222] Resetting endpoints for master service "kubernetes" to [192.168.6.128]
  21. Sep 20 03:08:30 ubuntu kube-apiserver[34393]: I0920 03:08:30.328625 34393 controller.go:606] quota admission added evaluator for: endpoints

Master 三大组件 kube-controller-manager 部署

配置文件

目录 /usr/lib/systemd/system/ 新建配置文件 kube-controller-manager.service 配置信息可参考 官方:kube-controller-manager 配置详解

配置讲解

vim /usr/lib/systemd/system/kube-controller-manager.service

  1. [Unit]
  2. Description=Kubernetes Controller Manager
  3. Documentation=https://github.com/GoogleCloudPlatform/kubernetes
  4. [Service]
  5. ExecStart=/usr/local/bin/kube-controller-manager \
  6. --address=127.0.0.1 \
  7. --master=http://127.0.0.1:8080 \
  8. --allocate-node-cidrs=true \
  9. --service-cluster-ip-range=10.68.0.0/16 \
  10. --cluster-cidr=172.20.0.0/16 \
  11. --cluster-name=kubernetes \
  12. --leader-elect=true \
  13. --cluster-signing-cert-file=/usr/src/kubernetes/ca/ca.pem \
  14. --cluster-signing-key-file=/usr/src/kubernetes/ca/ca-key.pem \
  15. --service-account-private-key-file=/usr/src/kubernetes/ca/ca-key.pem \
  16. --root-ca-file=/usr/src/kubernetes/ca/ca.pem \
  17. --v=2
  18. Restart=on-failure
  19. RestartSec=5
  20. [Install]
  21. WantedBy=multi-user.target

启动 Kube kube-controller-manager 服务

  1. $ cd /usr/lib/systemd/system/
  2. $ systemctl daemon-reload # 修改配置重启的时候用
  3. $ systemctl enable kube-controller-manager.service
  4. $ service kube-controller-manager start

检查 Kube kube-controller-manager 服务

  1. $ systemctl status kube-controller-manager
  2. kube-controller-manager.service - Kubernetes Controller Manager
  3. Loaded: loaded (/usr/lib/systemd/system/kube-controller-manager.service; enabled; vendor preset: enabled)
  4. Active: active (running) since Fri 2019-09-20 22:37:21 PDT; 1min 39s ago
  5. Docs: https://github.com/GoogleCloudPlatform/kubernetes
  6. Main PID: 35904 (kube-controller)
  7. Tasks: 7
  8. Memory: 94.2M
  9. CPU: 3.194s
  10. CGroup: /system.slice/kube-controller-manager.service

Master 三大组件 kube-scheduler 部署

配置文件

目录 /usr/lib/systemd/system/ 新建配置文件 kube-scheduler.service 配置信息可参考 官方:kube-scheduler 配置详解

配置讲解

vim /usr/lib/systemd/system/kube-scheduler.service

  1. [Unit]
  2. Description=Kubernetes Scheduler
  3. Documentation=https://github.com/GoogleCloudPlatform/kubernetes
  4. [Service]
  5. ExecStart=/usr/local/bin/kube-scheduler \
  6. --address=127.0.0.1 \
  7. --master=http://127.0.0.1:8080 \
  8. --leader-elect=true \
  9. --log-dir=/var/log/kubernetes \
  10. --v=2
  11. Restart=on-failure
  12. RestartSec=5
  13. [Install]
  14. WantedBy=multi-user.target

启动 Kube kube-scheduler 服务

  1. $ cd /usr/lib/systemd/system/
  2. $ systemctl daemon-reload # 修改配置重启的时候用
  3. $ systemctl enable kube-scheduler.service
  4. $ service kube-scheduler start

检查 Kube kube-scheduler 服务

  1. $ systemctl status kube-scheduler
  2. kube-scheduler.service - Kubernetes Scheduler
  3. Loaded: loaded (/usr/lib/systemd/system/kube-scheduler.service; enabled; vendor preset: enabled)
  4. Active: active (running) since Sat 2019-09-21 04:52:01 PDT; 5s ago
  5. Docs: https://github.com/GoogleCloudPlatform/kubernetes
  6. Main PID: 36508 (kube-scheduler)
  7. Tasks: 7
  8. Memory: 35.9M
  9. CPU: 1.774s
  10. CGroup: /system.slice/kube-scheduler.service
  11. └─36508 /usr/local/bin/kube-scheduler --address=127.0.0.1 --master=http://127.0.0.1:8080 --leader-elect=true --log-dir=/var/log/kubernetes --v=2

Master 节点验证

这里就要使用到了 kubectl 工具,验证下上面安装的 kube-scheduler、kube-controller-manager 和 kube-apiserver 这三个节点的状态

  1. # 查看各组件信息
  2. $ kubectl get componentstatuses
  3. NAME STATUS MESSAGE ERROR
  4. controller-manager Healthy ok
  5. scheduler Healthy ok
  6. etcd-0 Healthy {"health":"true"}

Calico 部署

Calico 为容器和虚拟机工作负载提供安全的网络连接。

Calico 创建并管理平面第 3 层网络,为每个工作负载分配一个完全可路由的 IP 地址。 工作负载无需 IP 封装或网络地址转换即可进行通信,以实现裸机性能,更轻松的故障排除和更好的互操作性。 在需要覆盖的环境中,Calico 使用 IP-in-IP 隧道或可以与其他覆盖网络一起使用。

Calico 还提供动态实施网络安全规则的功能。 使用 Calico 的简单策略语言,您可以实现对容器,虚拟机工作负载和裸机主机端点之间的通信的细粒度控制。

Calico v3.2 经过量产证明,可与 Kubernetes,OpenShift 和 OpenStack 集成。

Calico 官网的快速入门文档介绍: https://docs.projectcalico.org/v3.2/introduction/

系统服务加 Docker 方式安装

查看了很多安装方式,官网也有介绍,但是对于新手来说还是有点无从下手,这里采用系统服务加 Docker 方式来安装

vim /lib/systemd/system/kube-calico.service

  1. [Unit]
  2. Description=calico node
  3. After=docker.service
  4. Requires=docker.service
  5. [Service]
  6. User=root
  7. PermissionsStartOnly=true
  8. ExecStart=/usr/bin/docker run --net=host --privileged --name=calico-node \
  9. -e ETCD_ENDPOINTS=https://192.168.6.128:2379 \
  10. -e ETCD_CA_CERT_FILE=/usr/src/kubernetes/ca/ca.pem \
  11. -e ETCD_CERT_FILE=/usr/src/kubernetes/ca/calico/calico.pem \
  12. -e ETCD_KEY_FILE=/usr/src/kubernetes/ca/calico/calico-key.pem \
  13. -e CALICO_LIBNETWORK_ENABLED=true \
  14. -e CALICO_NETWORKING_BACKEND=bird \
  15. -e CALICO_DISABLE_FILE_LOGGING=true \
  16. -e CALICO_IPV4POOL_CIDR=172.20.0.0/16 \
  17. -e CALICO_IPV4POOL_IPIP=off \
  18. -e FELIX_DEFAULTENDPOINTTOHOSTACTION=ACCEPT \
  19. -e FELIX_IPV6SUPPORT=false \
  20. -e FELIX_LOGSEVERITYSCREEN=info \
  21. -e FELIX_IPINIPMTU=1440 \
  22. -e FELIX_HEALTHENABLED=true \
  23. -e IP= \
  24. -v /usr/src/kubernetes/ca:/usr/src/kubernetes/ca \
  25. -v /var/run/calico:/var/run/calico \
  26. -v /lib/modules:/lib/modules \
  27. -v /run/docker/plugins:/run/docker/plugins \
  28. -v /var/run/docker.sock:/var/run/docker.sock \
  29. -v /var/log/calico:/var/log/calico \
  30. registry.cn-hangzhou.aliyuncs.com/imooc/calico-node:v2.6.2
  31. ExecStop=/usr/bin/docker rm -f calico-node
  32. Restart=always
  33. RestartSec=10
  34. [Install]
  35. WantedBy=multi-user.target

启动 kube-calico 服务

  1. $ cd /lib/systemd/system/
  2. $ systemctl daemon-reload # 修改配置重启的时候用
  3. $ systemctl enable kube-calico.service
  4. $ service kube-calico start

检查 kube-calico 服务

以下通过 systemctl status kube-calico 命令检查 Active 状态是否为 running,也可以通过 journalctl -f -u kube-calico 检查运行日志

  1. $ systemctl status kube-calico
  2. kube-calico.service - calico node
  3. Loaded: loaded (/lib/systemd/system/kube-calico.service; enabled; vendor preset: enabled)
  4. Active: active (running) since Mon 2019-09-23 00:35:53 PDT; 1min 45s ago
  5. Main PID: 54179 (docker)
  6. CGroup: /system.slice/kube-calico.service
  7. └─54179 /usr/bin/docker run --net=host --privileged --name=calico-node -e ETCD_ENDPOINTS=https://192.168.6.128:2379 -e ETCD_CA_CERT_FILE=/usr/src/kubernetes/ca/ca.pem -e ETCD_CERT_FIL

calico 客户端工具 calicoctl

Calico 的二进制程序文件 calicoctl 可以直接操作 Calico 存储来查看,修改或配置 Calico 系统特性

  1. $ wget https://github.com/projectcalico/calicoctl/releases/download/v3.2.8/calicoctl
  2. $ chmod 755 calicoctl
  3. $ mv calicoctl /usr/local/bin/

calicoctl 配置

https://docs.projectcalico.org/v3.2/usage/calicoctl/configure/

kube-proxy 部署

kube-proxy 配置详解

阅读推荐

以下有些虽不是用的二进制方式安装,有需要的也可以参考下