一、初始化系统环境

ip地址                  主机名               角色

192.168.20.40   k8s-master1         主节点1

192.168.20.41   k8s-master2         主节点2

192.168.20.42   k8s-node1         工作节点1\etc节点1

192.168.20.43   k8s-node2         工作节点2\etc节点2

192.168.20.44   k8s-node3         工作节点3\etc节点3

这里先以k8s-master1节点为例,其他节点类似操作。  


1)主机名修改

[root@k8s-master1 ~]# hostnamectl set-hostname k8s-master1

如果DNS不支持解析主机名称,则需要修改/etc/hosts文件,添加主机名和IP的对应关系:

[root@k8s-master1 ~]# cat >> /etc/hosts <<EOF

192.168.20.40 k8s-master1

192.168.20.41 k8s-master2

192.168.20.42 k8s-node1

192.168.20.43 k8s-node2

192.168.20.44 k8s-node3

192.168.20.42 k8s-etcd1

192.168.20.43 k8s-etcd2

192.168.20.44 k8s-etcd3

EOF

Kubernetes部署etcd集群_java

操作都是在k8s-master1节点上执行,然后远程分发文件到其他节点机器上并远程执行命令,其它节点的ssh信任关系。

配置变量脚本文件

[root@k8s-master1 ~]# vim /k8s/all.sh

Kubernetes部署etcd集群_java_02

二、创建集群中需要的CA证书和秘钥

[root@k8s-master1 ~]# mkdir -p /opt/k8s/work && cd /opt/k8s/work

[root@k8s-master1 work]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64

[root@k8s-master1 work]# mv cfssl_linux-amd64 /opt/k8s/bin/cfssl

[root@k8s-master1 work]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64

[root@k8s-master1 work]# mv cfssljson_linux-amd64 /opt/k8s/bin/cfssljson

[root@k8s-master1 work]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

[root@k8s-master1 work]# mv cfssl-certinfo_linux-amd64 /opt/k8s/bin/cfssl-certinfo

[root@k8s-master1 work]# chmod +x /opt/k8s/bin/*

[root@k8s-master1 work]# export PATH=/opt/k8s/bin:$PATH

2)创建根证书 (CA)

CA 证书是集群所有节点共享的,只需要创建一个 CA 证书,后续创建的所有证书都由它签名。

2.1)创建配置文件

CA 配置文件用于配置根证书的使用场景 (profile) 和具体参数 (usage,过期时间、服务端认证、客户端认证、加密等),后续在签名其它证书时需要指定特定场景。

[root@k8s-master1 work]# cd /opt/k8s/work

[root@k8s-master1 work]# cat > ca-config.json <<EOF

{

  "signing": {

    "default": {

      "expiry": "87600h"

    },

    "profiles": {

      "kubernetes": {

        "usages": [

            "signing",

            "key encipherment",

            "server auth",

            "client auth"

        ],

        "expiry": "87600h"

      }

    }

  }

}

EOF 

Kubernetes部署etcd集群_java_03Kubernetes部署etcd集群_java_04

2.2)创建证书签名请求文件

[root@k8s-master1 work]# cd /opt/k8s/work

[root@k8s-master1 work]# cat > ca-csr.json <<EOF

{

  "CN": "kubernetes",

  "key": {

    "algo": "rsa",

    "size": 2048

  },

  "names": [

    {

      "C": "CN",

      "ST": "BeiJing",

      "L": "BeiJing",

      "O": "k8s",

      "OU": "4Paradigm"

    }

  ]

}

EOF

Kubernetes部署etcd集群_java_05

Kubernetes部署etcd集群_java_06

2.3)生成 CA 证书和私钥

[root@k8s-master1 work]# cd /opt/k8s/work

[root@k8s-master1 work]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca

[root@k8s-master1 work]# ls ca*

ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem

[root@k8s-master1 work]#

Kubernetes部署etcd集群_java_07

3)分发证书文件

将生成的 CA 证书、秘钥文件、配置文件拷贝到所有节点的 /etc/kubernetes/cert 目录下:

[root@k8s-master1 work]# cd /opt/k8s/work

[root@k8s-master1 work]# for node_all_ip in ${NODE_ALL_IPS[@]}

  do

    echo ">>> ${node_all_ip}"

    ssh root@${node_all_ip} "mkdir -p /etc/kubernetes/cert"

    scp ca*.pem ca-config.json root@${node_all_ip}:/etc/kubernetes/cert

  done

Kubernetes部署etcd集群_java_08

三、部署kubectl命令行工具

1)下载和分发kubectl二进制文件

[root@k8s-master1 ~]# cd /opt/k8s/work

[root@k8s-master1 work]# wget https://dl.k8s.io/v1.14.2/kubernetes-client-linux-amd64.tar.gz

[root@k8s-master1 work]# tar -xzvf kubernetes-client-linux-amd64.tar.gz

分发到所有使用kubectl的节点,这里只分发到两个master节点

[root@k8s-master1 work]# cd /opt/k8s/work

[root@k8s-master1 work]# for node_master_ip in ${NODE_MASTER_IPS[@]}

do

  echo ">>> ${node_master_ip}"

  scp kubernetes/client/bin/kubectl root@${node_master_ip}:/opt/k8s/bin/

  ssh root@${node_master_ip} "chmod +x /opt/k8s/bin/*"

done

2) 创建admin证书和私钥

kubectl与apiserver https安全端口通信,apiserver 对提供的证书进行认证和授权。

kubectl作为集群的管理工具,需要被授予最高权限,这里创建具有最高权限的 admin 证书。

创建证书签名请求:

[root@k8s-master1 work]# cd /opt/k8s/work

[root@k8s-master1 work]# cat > admin-csr.json <<EOF

{

  "CN": "admin",

  "hosts": [],

  "key": {

    "algo": "rsa",

    "size": 2048

  },

  "names": [

    {

      "C": "CN",

      "ST": "BeiJing",

      "L": "BeiJing",

      "O": "system:masters",

      "OU": "4Paradigm"

    }

  ]

}

EOF

生成证书和私钥:

[root@k8s-master1 work]# cd /opt/k8s/work

[root@k8s-master1 work]# cfssl gencert -ca=/opt/k8s/work/ca.pem \

  -ca-key=/opt/k8s/work/ca-key.pem \

  -config=/opt/k8s/work/ca-config.json \

  -profile=kubernetes admin-csr.json | cfssljson -bare admin

[root@k8s-master1 work]# ls admin*

admin.csr  admin-csr.json  admin-key.pem  admin.pem 

3)创建 kubeconfig 文件

kubeconfig 为 kubectl 的配置文件,包含访问 apiserver 的所有信息,如 apiserver 地址、CA 证书和自身使用的证书;

[root@k8s-master1 work]# cd /opt/k8s/work

设置集群参数

[root@k8s-master1 work]# kubectl config set-cluster kubernetes \

  --certificate-authority=/opt/k8s/work/ca.pem \

  --embed-certs=true \

  --server=${KUBE_APISERVER} \

  --kubeconfig=kubectl.kubeconfig

设置客户端认证参数

[root@k8s-master1 work]# kubectl config set-credentials admin \

  --client-certificate=/opt/k8s/work/admin.pem \

  --client-key=/opt/k8s/work/admin-key.pem \

  --embed-certs=true \

  --kubeconfig=kubectl.kubeconfig 

设置上下文参数

[root@k8s-master1 work]# kubectl config set-context kubernetes \

  --cluster=kubernetes \

  --user=admin \

  --kubeconfig=kubectl.kubeconfig 

设置默认上下文

[root@k8s-master1 work]# kubectl config use-context kubernetes --kubeconfig=kubectl.kubeconfig

4)分发 kubeconfig 文件, 保存的文件名为 ~/.kube/config;

分发到所有使用 kubectl 命令的节点,即分发到两个master节点上

[root@k8s-master1 work]# cd /opt/k8s/work

[root@k8s-master1 work]# for node_master_ip in ${NODE_MASTER_IPS[@]}

do

  echo ">>> ${node_master_ip}"

  ssh root@${node_master_ip} "mkdir -p ~/.kube"

  scp kubectl.kubeconfig root@${node_master_ip}:~/.kube/config

done

四、部署etcd集群

1)下载和分发etcd二进制文件

[root@k8s-master1 ~]# cd /opt/k8s/work

[root@k8s-master1 work]# wget https://github.com/coreos/etcd/releases/download/v3.3.13/etcd-v3.3.13-linux-amd64.tar.gz

[root@k8s-master1 work]# tar -xvf etcd-v3.3.13-linux-amd64.tar.gz

Kubernetes部署etcd集群_java_09

分发二进制文件到etcd集群所有节点:

[root@k8s-master1 work]# cd /opt/k8s/work

[root@k8s-master1 work]# for node_etcd_ip in ${NODE_ETCD_IPS[@]}

  do

    echo ">>> ${node_etcd_ip}"

    scp etcd-v3.3.13-linux-amd64/etcd* root@${node_etcd_ip}:/opt/k8s/bin

    ssh root@${node_etcd_ip} "chmod +x /opt/k8s/bin/*"

  done

Kubernetes部署etcd集群_java_10

2) 创建etcd证书和私钥

Kubernetes部署etcd集群_java_11

生成证书和私钥

Kubernetes部署etcd集群_java_12

分发生成的证书和私钥到各etcd节点

Kubernetes部署etcd集群_java_13

3) 创建etcd的systemd unit模板文件

Kubernetes部署etcd集群_java_14

4)为各etcd节点创建和分发 etcd systemd unit 文件

[root@k8s-master1 work]# ls *.service                

etcd-192.168.20.42.service  etcd-192.168.20.43.service  etcd-192.168.20.44.service

Kubernetes部署etcd集群_java_15

分发生成的 systemd unit 文件:

[root@k8s-master1 work]# for node_etcd_ip in ${NODE_ETCD_IPS[@]}

  do

    echo ">>> ${node_etcd_ip}"

    scp etcd-${node_etcd_ip}.service root@${node_etcd_ip}:/etc/systemd/system/etcd.service

  done

Kubernetes部署etcd集群_java_16

5)启动 etcd 服务

Kubernetes部署etcd集群_java_17

6)检查etcd服务启动结果

Kubernetes部署etcd集群_java_18

7)验证服务状态

Kubernetes部署etcd集群_java_19

8)查看当前etcd集群中的leader

Kubernetes部署etcd集群_java_20

当前的leader节点为192.168.20.42

9)查看启动端口

Kubernetes部署etcd集群_java_21

Kubernetes部署etcd集群_java_22

Kubernetes部署etcd集群_java_23

↓↓ 点击"阅读原文" 【加入DevOps运维团

相关阅读:


k8s安装实战总结



Kubernetes部署etcd集群_java_24