代码改变世界

k8s

2019-11-13 16:55  寒霜冻土  阅读(236)  评论(0)    收藏  举报

Kubernetes-V1.14.2 二进制编译安装

一、环境准备

1、操作系统环境初始化和准备工作:

1.1、节点规划

准备部署一个 一主两从 的 三节点 Kubernetes集群,整体节点规划如下表所示:

主机名

IP

角色

k8s-master

192.168.189.139

k8s主节点

k8s-node-1

192.168.189.131

k8s从节点

k8s-node-2

192.168.189.132

k8s从节点

 

下面介绍一下各个节点的软件版本:

操作系统:CentOS-7.6(1810)-64Bit

内核版本:4.18.9

Docker版本:18.09.6-3.el7

Kubernetes版本:1.14.2

2、安装系统并升级内核

1、安装CentOS 7.6-64bit最小化系统,注意:在安装过程中记得设置好网络参数,IPV4: 选择手动设置地址,DNS等,可以将IPV6忽略掉

2、系统安装好后,先安装一些基础工具

yum -y install bash-completion.noarch net-tools \

 vim lrzsz wget tree screen lsof tcpdump unzip tree

3、上载先准备好的 kernel-ml-4.18.9.tar.gz

 

tar xf  kernel-ml-4.18.9.tar.gz 
cd /kernel-ml-4.18.9 && yum -y install *.rpm
cd /tmp && yum -y install *.rpm   
sed -i 's#GRUB_DEFAULT#\#GRUB_DEFAULT#' /etc/default/grub  
sed -i '3a GRUB_DEFAULT=0' /etc/default/grub 
grub2-mkconfig -o /boot/grub2/grub.cfg 
reboot 
#重启系统查看内核版本 
uname -r   
# 版本号  4.18.9-1.el7.elrepo.x86_64 

3、系统准备和优化

#关闭selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
#关闭防火墙
setenforce 0
systemctl stop firewalld && systemctl disable firewalld
#远程连接优化
sed -i 's#GSSAPIAuthentication yes#GSSAPIAuthentication no#g' /etc/ssh/sshd_config
sed -i 's#\#UseDNS yes#UseDNS no#g' /etc/ssh/sshd_config
##开启密码登陆
sed -i 's#PasswordAuthentication no#PasswordAuthentication yes#g' /etc/ssh/sshd_config
#开启root远程登陆
sed -i 's#PermitRootLogin without-password#PermitRootLogin yes#g' /etc/ssh/sshd_config
#重启sshd服务
systemctl restart sshd
#修改系统时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#修改配置yum源
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache
#安装基础命令
yum -y install bash-completion.noarch net-tools vim lrzsz wget tree screen lsof tcpdump
#关闭swapp
swapoff -a
#为了防止开机自动挂载 swap 分区,可以注释 /etc/fstab 中相应的条目
$ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# centos7 下需要给网卡建立桥接
vim /etc/sysctl.conf
vm.swappiness = 0
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
sysctl -p
###PS:建立桥接时出现文件不存在错误,用 modprobe br_netfilter

4、安装docker

#卸载旧版本
yum remove docker docker-client docker-client-latest docker-common \
docker-latest docker-latest-logrotate docker-logrotate docker-engine
#安装docker yum源
yum install -y yum-utils
yum-config-manager --add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker-ce
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl restart docker
systemctl enable docker && systemctl start docker

5、主机名、DNS设置、免密认证

1)分别设置各节点主机名

hostnamectl --static set-hostname  k8s-master
hostnamectl --static set-hostname  k8s-node-1
hostnamectl --static set-hostname  k8s-node-2

2)所有节点 主机名/IP加入 hosts解析

vim /etc/hosts
192.168.189.139 k8s-master
192.168.189.131 k8s-node-1
192.168.189.132 k8s-node-2

3)免密认证

ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys
scp -rp /root/.ssh k8s-node-1:/root
scp -rp /root/.ssh k8s-node-2:/root
ssh k8s-master
ssh k8s-node-1
ssh k8s-node-2

6、在各主机分别创建kubernetes目录

mkdir -p /app/kubernetes/{cfg,bin,ssl,log} 

至此,编译安装kubernetes 1.14.2 二进制版准备工作完成

二、安装etcd

1、安装配置CFSSL

1.1、下载配置CFSSL

# 使用wget下载cfssl包,也可rz直接导入,文档附带资源包
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
# 移动下载好的包
mv cfssl_linux-amd64 /app/kubernetes/bin/cfssl
mv cfssljson_linux-amd64 /app/kubernetes/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /app/kubernetes/bin/cfssl-certinfo
# 赋予执行权限
chmod +x /app/kubernetes/bin/*
# 设置系统环境变量(可二选一,推荐1)
# 方式1:
vim /etc/profile
export PATH=$PATH:/app/kubernetes/bin
source /etc/profile
#方式2:
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
# cfssl同步到两个节点上
scp /app/kubernetes/bin/cfssl* k8s-node-1:/app/kubernetes/bin
scp /app/kubernetes/bin/cfssl* k8s-node-2:/app/kubernetes/bin
# 同步profile配置文件
scp /etc/profile k8s-node-1:/etc
scp /etc/profile k8s-node-2:/etc
# 然后分别在两个节点上 执行
source /etc/profile

1.2、初始化CFSSL

mkdir /usr/local/src/ssl && cd /usr/local/src/ssl
cfssl print-defaults config > ca-config.json
cfssl print-defaults csr > ca-csr.json

1.3、创建用来生成 CA 文件的 JSON 配置文件

vim ca-config.json
{
  "signing": {
    "default": {
      "expiry": "8760h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "8760h"
      }
    }
  }
}

1.4、创建用来生成 CA 证书签名请求(CSR)的 JSON 配置文件

vim ca-csr.json
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

1.5、生成CA证书(ca.pem)和密钥(ca-key.pem)

cfssl gencert -initca ca-csr.json | cfssljson -bare ca
[root@k8s-master-2 ssl]# ls -l ca*
-rw-r--r-- 1 root root  290 6月  11 11:52 ca-config.json
-rw-r--r-- 1 root root 1001 6月  11 11:55 ca.csr
-rw-r--r-- 1 root root  208 6月  11 11:53 ca-csr.json
-rw------- 1 root root 1679 6月  11 11:55 ca-key.pem
-rw-r--r-- 1 root root 1359 6月  11 11:55 ca.pem

1.6、分发证书

cp ca.csr ca.pem ca-key.pem ca-config.json /app/kubernetes/ssl
scp ca.csr ca.pem ca-key.pem ca-config.json k8s-node-1:/app/kubernetes/ssl
scp ca.csr ca.pem ca-key.pem ca-config.json k8s-node-2:/app/kubernetes/ssl

2、安装etcd

2.1、 准备etcd软件包

wget https://github.com/etcd-io/etcd/releases/download/v3.3.13/\
etcd-v3.3.13-linux-amd64.tar.gz
tar xf etcd-v3.3.13-linux-amd64.tar.gz && cd etcd-v3.3.13-linux-amd64/
cp etcd* /app/kubernetes/bin/
scp etcd* k8s-node-1:/app/kubernetes/bin/
scp etcd* k8s-node-2:/app/kubernetes/bin/

2.2、 创建 etcd 证书签名请求

vim etcd-csr.json
# 注意将hosts中的ip地址改写为自己机器的,加入集群中所有节点
{
  "CN": "etcd",
  "hosts": [
    "127.0.0.1",
    "192.168.189.139",
    "192.168.189.131",
    "192.168.189.132"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

2.3、 生成 etcd 证书和私钥

cfssl gencert -ca=/app/kubernetes/ssl/ca.pem \
  -ca-key=/app/kubernetes/ssl/ca-key.pem \
  -config=/app/kubernetes/ssl/ca-config.json \
  -profile=kubernetes etcd-csr.json | cfssljson -bare etcd

2.4、 将证书移动到/opt/kubernetes/ssl目录下

scp etcd*.pem /app/kubernetes/ssl/
scp etcd*.pem k8s-node-1:/app/kubernetes/ssl/
scp etcd*.pem k8s-node-2:/app/kubernetes/ssl/
rm -rf etcd.csr etcd-csr.json

2.5、 设置ETCD配置文件

vim /app/kubernetes/cfg/etcd.conf
#[member]
ETCD_NAME="etcd-node1"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
# ETCD_SNAPSHOT_COUNTER="10000"
# ETCD_HEARTBEAT_INTERVAL="100"
# ETCD_ELECTION_TIMEOUT="1000"
# 注意将ip地址改为自己机器的
ETCD_LISTEN_PEER_URLS="https://192.168.189.139:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.189.139:2379,https://127.0.0.1:2379"
# ETCD_MAX_SNAPSHOTS="5"
# ETCD_MAX_WALS="5"
# ETCD_CORS=""
#[cluster]
# 注意将ip地址改为自己机器的
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.189.139:2380"
# if you use different ETCD_NAME (e.g. test),
# set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
ETCD_INITIAL_CLUSTER="etcd-node1=https://192.168.189.139:2380,etcd-node2=https://192.168.189.131:2380,etcd-node3=https://192.168.189.132:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="k8s-etcd-cluster"
# 注意将ip地址改为自己机器的
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.189.139:2379"
#[security]
CLIENT_CERT_AUTH="true"
ETCD_CA_FILE="/app/kubernetes/ssl/ca.pem"
ETCD_CERT_FILE="/app/kubernetes/ssl/etcd.pem"
ETCD_KEY_FILE="/app/kubernetes/ssl/etcd-key.pem"
PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_CA_FILE="/app/kubernetes/ssl/ca.pem"
ETCD_PEER_CERT_FILE="/app/kubernetes/ssl/etcd.pem"
ETCD_PEER_KEY_FILE="/app/kubernetes/ssl/etcd-key.pem"

2.6、 创建etcd启动服务

vim /etc/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=simple
WorkingDirectory=/var/lib/etcd
EnvironmentFile=-/app/kubernetes/cfg/etcd.conf
# set GOMAXPROCS to number of processors
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /app/kubernetes/bin/etcd"
Type=notify
[Install]
WantedBy=multi-user.target

2.7、 复制相关文件到其它机器

scp /app/kubernetes/cfg/etcd.conf k8s-node-1:/app/kubernetes/cfg/
scp /app/kubernetes/cfg/etcd.conf k8s-node-2:/app/kubernetes/cfg/
scp /etc/systemd/system/etcd.service k8s-node-1:/etc/systemd/system/
scp /etc/systemd/system/etcd.service k8s-node-2:/etc/systemd/system/

修改另外两台机器的etcd.conf文件中的ETCD_NAME和监听IP,如下图所示,其中标蓝线的地方,ip都更换为当前机器的ip

 

然后在每个机器上面创建 /var/lib/etcd的文件夹 mkdir /var/lib/etcd 然后启动服务

systemctl daemon-reload && systemctl enable etcd
systemctl start etcd && systemctl status etcd
systemctl daemon-reload&& systemctl restart etcd && systemctl status etcd

2.8、 验证集群

复制etcdctl可执行文件到/usr/local/bin下 cp etcdctl /usr/local/bin 文件在解压包中

etcdctl --endpoints=https://192.168.189.139:2379 \
  --ca-file=/app/kubernetes/ssl/ca.pem \
  --cert-file=/app/kubernetes/ssl/etcd.pem \
  --key-file=/app/kubernetes/ssl/etcd-key.pem cluster-health
 

如果成功,则输出

[root@k8s-master-2 etcd-v3.3.13-linux-amd64]# etcdctl \
--endpoints=https://192.168.189.139:2379   \
--ca-file=/app/kubernetes/ssl/ca.pem   \
--cert-file=/app/kubernetes/ssl/etcd.pem   \
--key-file=/app/kubernetes/ssl/etcd-key.pem cluster-health
member 503e8f4db410fddd is healthy: got healthy result from \
https://192.168.189.139:2379
member 9e40edb005055a20 is healthy: got healthy result from \
https://192.168.189.131:2379
member e2e15ce4d2c75a68 is healthy: got healthy result from \
https://192.168.189.132:2379

三、master节点部署

3.1 复制二进制文件

tar xf kubernetes-server-linux-amd64.tar.gz
cd /root/kubernetes/server/bin
cp kube-apiserver kube-controller-manager kube-scheduler /app/kubernetes/bin/

3.2 部署kube-apiserver

3.2.1、 创建生成CSR的 JSON 配置文件

vim kubernetes-csr.json
{
  "CN": "kubernetes",
  "hosts": [
    "127.0.0.1",
    ### 需要将IP改为自己master的IP,并将注释删除
    "192.168.189.139", 
    "10.1.0.1",
    "kubernetes",
    "kubernetes.default",
    "kubernetes.default.svc",
    "kubernetes.default.svc.cluster",
    "kubernetes.default.svc.cluster.local"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

3.2.2、 生成 kubernetes 证书和私钥

cfssl gencert -ca=/app/kubernetes/ssl/ca.pem \
  -ca-key=/app/kubernetes/ssl/ca-key.pem  \
  -config=/app/kubernetes/ssl/ca-config.json \
  -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
cp kubernetes*.pem /app/kubernetes/ssl/
scp kubernetes*.pem k8s-node-1:/app/kubernetes/ssl/
scp kubernetes*.pem k8s-node-2:/app/kubernetes/ssl/

3.2.3、 创建 kube-apiserver 使用的客户端 token 文件

### 下面这个命令会产生一串字符串,请保存到文本,下面需要多次使用
head -c 16 /dev/urandom | od -An -t x | tr -d ' '
#### 创建这个文件  
vim /app/kubernetes/ssl/bootstrap-token.csv  
### 用生成的字符串替换下面的 “8fa448.... ”这一串数字
8fa4488b7751e2ba9f58555a8cb0cef4,kubelet-bootstrap,10001,"system:kubelet-bootstrap"

3.2.4、 创建基础用户名/密码认证配置

vim /app/kubernetes/ssl/basic-auth.csv
admin,admin,1
readonly,readonly,2

3.2.5、 配置kubernetes apiserver 启动服务

vim  /usr/lib/systemd/system/kube-apiserver.service
 
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
 
[Service]
ExecStart=/app/kubernetes/bin/kube-apiserver \
  --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota,NodeRestriction \
  --bind-address=192.168.189.139 \
  --insecure-bind-address=127.0.0.1 \
  --authorization-mode=Node,RBAC \
  --runtime-config=rbac.authorization.k8s.io/v1 \
  --kubelet-https=true \
  --anonymous-auth=false \
  --basic-auth-file=/app/kubernetes/ssl/basic-auth.csv \
  --enable-bootstrap-token-auth \
  --token-auth-file=/app/kubernetes/ssl/bootstrap-token.csv \
  --service-cluster-ip-range=10.1.0.0/16 \
  --service-node-port-range=9000-40000 \
  --tls-cert-file=/app/kubernetes/ssl/kubernetes.pem \
  --tls-private-key-file=/app/kubernetes/ssl/kubernetes-key.pem \
  --client-ca-file=/app/kubernetes/ssl/ca.pem \
  --service-account-key-file=/app/kubernetes/ssl/ca-key.pem \
  --etcd-cafile=/app/kubernetes/ssl/ca.pem \
  --etcd-certfile=/app/kubernetes/ssl/kubernetes.pem \
  --etcd-keyfile=/app/kubernetes/ssl/kubernetes-key.pem \
  --etcd-servers=https://192.168.189.139:2379,https://192.168.189.131:2379,https://192.168.189.132:2379 \
  --enable-swagger-ui=true \
  --allow-privileged=true \
  --audit-log-maxage=30 \
  --audit-log-maxbackup=3 \
  --audit-log-maxsize=100 \
  --audit-log-path=/app/kubernetes/log/api-audit.log \
  --event-ttl=1h \
  --v=2 \
  --logtostderr=false \
  --log-dir=/app/kubernetes/log
Restart=on-failure
RestartSec=5
Type=notify
LimitNOFILE=65536
 
[Install]
WantedBy=multi-user.target

注意:

--bind-address=192.168.189.139   将其换成自己的master节点IP
--etcd-servers=https:            后面的IP分别换成自己的master和node节点的IP

3.2.6、 启动服务

systemctl daemon-reload
systemctl enable kube-apiserver
systemctl start kube-apiserver
systemctl status kube-apiserver

3.3 部署controller manager服务

3.3.1、创建kube-controller-manager.service

vim /usr/lib/systemd/system/kube-controller-manager.service
 
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
 
[Service]
ExecStart=/app/kubernetes/bin/kube-controller-manager \
  --address=127.0.0.1 \
  --master=http://127.0.0.1:8080 \
  --allocate-node-cidrs=true \
  --service-cluster-ip-range=10.1.0.0/16 \
  --cluster-cidr=10.2.0.0/16 \
  --cluster-name=kubernetes \
  --cluster-signing-cert-file=/app/kubernetes/ssl/ca.pem \
  --cluster-signing-key-file=/app/kubernetes/ssl/ca-key.pem \
  --service-account-private-key-file=/app/kubernetes/ssl/ca-key.pem \
  --root-ca-file=/app/kubernetes/ssl/ca.pem \
  --leader-elect=true \
  --v=2 \
  --logtostderr=false \
  --log-dir=/app/kubernetes/log
 
Restart=on-failure
RestartSec=5
 
[Install]
WantedBy=multi-user.target

3.3.2、启动kube-controller-manager

systemctl daemon-reload
systemctl enable kube-controller-manager && systemctl start kube-controller-manager
systemctl status kube-controller-manager

3.4 部署kube-scheduler服务

3.4.1创建kube-scheduler.service

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

[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
 
[Service]
ExecStart=/app/kubernetes/bin/kube-scheduler \
  --address=127.0.0.1 \
  --master=http://127.0.0.1:8080 \
  --leader-elect=true \
  --v=2 \
  --logtostderr=false \
  --log-dir=/app/kubernetes/log
 
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

3.4.2启动kube-scheduler.service

systemctl daemon-reload
systemctl enable kube-scheduler && systemctl start kube-scheduler
systemctl status kube-scheduler

3.5 部署kubectl 命令行工具

3.5.1 复制二进制包

cd kubernetes/server/bin/
cp kubectl /app/kubernetes/bin/

3.5.2 创建 admin 证书签名请求

vim admin-csr.json
 
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}

3.5.3 生成 admin 证书和私钥

cfssl gencert -ca=/app/kubernetes/ssl/ca.pem \
   -ca-key=/app/kubernetes/ssl/ca-key.pem \
   -config=/app/kubernetes/ssl/ca-config.json \
   -profile=kubernetes admin-csr.json | cfssljson -bare admin
 
# 把生成好的密钥放入到kubernetes下的ssl中
cp admin*.pem /app/kubernetes/ssl/ 

3.5.4 设置集群参数

将kubectl可执行文件复制到 /usr/local/bin下 文件在解压包中

kubectl config set-cluster kubernetes \
   --certificate-authority=/app/kubernetes/ssl/ca.pem \
   --embed-certs=true \
   --server=https://192.168.189.139:6443
 
#### 注意将IP换为自己的master节点IP

3.5.5 设置客户端认证参数

kubectl config set-credentials admin \
   --client-certificate=/app/kubernetes/ssl/admin.pem \
   --embed-certs=true \
   --client-key=/app/kubernetes/ssl/admin-key.pem

3.5.6 设置上下文参数

kubectl config set-context kubernetes \
   --cluster=kubernetes \
   --user=admin

3.5.7 设置默认上下文

kubectl config use-context kubernetes

3.5.8 查看服务是否正常

kubectl get cs

正常则为:

[root@k8s-master bin]# kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"}   
etcd-2               Healthy   {"health":"true"}   
etcd-1               Healthy   {"health":"true"}

3.6 进行node节点安装部署

3.6.1 复制二进制包

cd ../kubernetes/server/bin/
cp kubelet kube-proxy /app/kubernetes/bin/
scp kubelet kube-proxy k8s-node-1:/app/kubernetes/bin/
scp kubelet kube-proxy k8s-node-2:/app/kubernetes/bin/

3.6.2 创建角色绑定

kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper --user=kubelet-bootstrap

3.6.3 创建 kubelet bootstrapping kubeconfig 文件

设置集群参数

kubectl config set-cluster kubernetes \
   --certificate-authority=/app/kubernetes/ssl/ca.pem \
   --embed-certs=true \
   --server=https://192.168.189.139:6443 \
   --kubeconfig=bootstrap.kubeconfig

设置客户端认证参数

kubectl config set-credentials kubelet-bootstrap \
   --token=8fa4488b7751e2ba9f58555a8cb0cef4 \
   --kubeconfig=bootstrap.kubeconfig
 
### 注意::--token的参数为上篇中的kube-apiserver 
###         使用的客户端 token 文件中的那个token

设置上下文参数

kubectl config set-context default \
   --cluster=kubernetes \
   --user=kubelet-bootstrap \
   --kubeconfig=bootstrap.kubeconfig

选择默认上下文

kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
 
scp bootstrap.kubeconfig /app/kubernetes/cfg/
scp bootstrap.kubeconfig k8s-node-1:/app/kubernetes/cfg/                                            
scp bootstrap.kubeconfig k8s-node-2:/app/kubernetes/cfg/

3.7 部署kubelet

# 设置CNI支持
mkdir -p /etc/cni/net.d
vim /etc/cni/net.d/10-default.conf
{
    "name": "flannel",
    "type": "flannel",
    "delegate": {
        "bridge": "docker0",
        "isDefaultGateway": true,
        "mtu": 1400
    }
}
 
# 创建kubelet目录
mkdir /var/lib/kubelet

创建kubelet启动服务配置

vim /usr/lib/systemd/system/kubelet.service
 
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service
 
[Service]
WorkingDirectory=/var/lib/kubelet
ExecStart=/app/kubernetes/bin/kubelet \
  --address=192.168.189.139 \
  --hostname-override=192.168.189.139 \
  --pod-infra-container-image=mirrorgooglecontainers/pause-amd64:3.0 \
  --experimental-bootstrap-kubeconfig=/app/kubernetes/cfg/bootstrap.kubeconfig \
  --kubeconfig=/app/kubernetes/cfg/kubelet.kubeconfig \
  --cert-dir=/app/kubernetes/ssl \
  --network-plugin=cni \
  --cni-conf-dir=/etc/cni/net.d \
  --cni-bin-dir=/app/kubernetes/bin/cni \
  --cluster-dns=10.1.0.2 \
  --cluster-domain=cluster.local. \
  --hairpin-mode hairpin-veth \
  --allow-privileged=true \
  --fail-swap-on=false \
  --logtostderr=true \
  --v=2 \
  --logtostderr=false \
  --log-dir=/app/kubernetes/log
Restart=on-failure
RestartSec=5

启动服务

systemctl daemon-reload
systemctl enable kubelet && systemctl start kubelet
systemctl status kubelet

在其他机器上创建下面2个文件夹

mkdir -p /etc/cni/net.d
mkdir /var/lib/kubelet

在主节点使用下面命令分发

scp /etc/cni/net.d/10-default.conf k8s-node-1:/etc/cni/net.d/10-default.conf
scp /etc/cni/net.d/10-default.conf k8s-node-2:/etc/cni/net.d/10-default.conf

下面2个文件要去对应机器修改IP

scp /usr/lib/systemd/system/kubelet.service \
k8s-node-1:/usr/lib/systemd/system/kubelet.service
 
scp /usr/lib/systemd/system/kubelet.service \
k8s-node-2:/usr/lib/systemd/system/kubelet.service
 
# 使用下面的命令,里面的两个IP都改为当前IP
vim /usr/lib/systemd/system/kubelet.service

在各个机器启动服务

systemctl daemon-reload
systemctl enable kubelet && systemctl start kubelet
systemctl status kubelet

查看csr请求

kubectl get csr

结果如下:

[root@k8s-master bin]# kubectl get csr
NAME                    AGE    REQUESTOR           CONDITION
node-csr-M7NH4jxhj...   8m4s   kubelet-bootstrap   Pending
node-csr-XjMnA02kn...   30s    kubelet-bootstrap   Pending
node-csr-uIqmVSeTF...   26s    kubelet-bootstrap   Pending

通过kubelet 的 TLS 证书请求

kubectl get csr|grep 'Pending' | awk 'NR>0{print $1}'| xargs \
kubectl certificate approve
kubectl get node

3.8 部署kube-proxy

配置kube-proxy使用LVS

yum install -y ipvsadm ipset conntrack

创建 kube-proxy 证书请求

vim kube-proxy-csr.json
 
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

生成证书

cfssl gencert -ca=/app/kubernetes/ssl/ca.pem \
   -ca-key=/app/kubernetes/ssl/ca-key.pem \
   -config=/app/kubernetes/ssl/ca-config.json \
   -profile=kubernetes  kube-proxy-csr.json | cfssljson -bare kube-proxy

复制证书到所有node节点

cp kube-proxy*.pem /app/kubernetes/ssl/
scp kube-proxy*.pem k8s-node-1:/app/kubernetes/ssl/
scp kube-proxy*.pem k8s-node-2:/app/kubernetes/ssl/

创建kube-proxy配置文件

kubectl config set-cluster kubernetes \
   --certificate-authority=/app/kubernetes/ssl/ca.pem \
   --embed-certs=true \
   --server=https://192.168.189.139:6443 \
   --kubeconfig=kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy \
   --client-certificate=/app/kubernetes/ssl/kube-proxy.pem \
   --client-key=/app/kubernetes/ssl/kube-proxy-key.pem \
   --embed-certs=true \
   --kubeconfig=kube-proxy.kubeconfig
kubectl config set-context default \
   --cluster=kubernetes \
   --user=kube-proxy \
   --kubeconfig=kube-proxy.kubeconfig
kubectl config use-context default \
   --kubeconfig=kube-proxy.kubeconfig

分发kubeconfig配置文件

scp kube-proxy.kubeconfig /app/kubernetes/cfg/
scp kube-proxy.kubeconfig k8s-node-1:/app/kubernetes/cfg/
scp kube-proxy.kubeconfig k8s-node-2:/app/kubernetes/cfg/

配置启动服务

#各节点都执行 并修改对应IP

mkdir /var/lib/kube-proxy

创建 kube-proxy.service

vim /usr/lib/systemd/system/kube-proxy.service
 
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
 
[Service]
WorkingDirectory=/var/lib/kube-proxy
ExecStart=/app/kubernetes/bin/kube-proxy \
  --bind-address=192.168.189.139 \
  --hostname-override=192.168.189.139 \
  --kubeconfig=/app/kubernetes/cfg/kube-proxy.kubeconfig \
--masquerade-all \
  --feature-gates=SupportIPVSProxyMode=true \
  --proxy-mode=ipvs \
  --ipvs-min-sync-period=5s \
  --ipvs-sync-period=5s \
  --ipvs-scheduler=rr \
  --logtostderr=true \
  --v=2 \
  --logtostderr=false \
  --log-dir=/app/kubernetes/log
 
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
 
[Install]
WantedBy=multi-user.target

同步到其他节点

scp /usr/lib/systemd/system/kube-proxy.service \
k8s-node-1:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/kube-proxy.service \
k8s-node-2:/usr/lib/systemd/system/
修改kube-proxy.service中的IP
vim /usr/lib/systemd/system/kube-proxy.service

各节点都启动服务

systemctl daemon-reload
systemctl enable kube-proxy && systemctl start kube-proxy
systemctl status kube-proxy

3.9 配置flannel网络

3.9.1 生成flannel证书

vim flanneld-csr.json

{

  "CN": "flanneld",

  "hosts": [],

  "key": {

    "algo": "rsa",

    "size": 2048

  },

  "names": [

    {

      "C": "CN",

      "ST": "BeiJing",

      "L": "BeiJing",

      "O": "k8s",

      "OU": "System"

    }

  ]

}

3.9.2 生成证书

cfssl gencert -ca=/app/kubernetes/ssl/ca.pem \

   -ca-key=/app/kubernetes/ssl/ca-key.pem \

   -config=/app/kubernetes/ssl/ca-config.json \

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

3.9.3 分发证书

cp flanneld*.pem /app/kubernetes/ssl/

scp flanneld*.pem k8s-node-1:/app/kubernetes/ssl/

scp flanneld*.pem k8s-node-2:/app/kubernetes/ssl/

3.9.4 下载Flannel软件包相关软件包

wget https://github.com/coreos/flannel/releases/download/v0.11.0/\

flannel-v0.11.0-linux-amd64.tar.gz

tar xf flannel-v0.11.0-linux-amd64.tar.gz

cd flannel-v0.11.0-linux-amd64/

cp flanneld mk-docker-opts.sh /app/kubernetes/bin/

scp flanneld mk-docker-opts.sh k8s-node-1:/app/kubernetes/bin/

scp flanneld mk-docker-opts.sh k8s-node-2:/app/kubernetes/bin/

wget https://github.com/kubernetes/kubernetes/releases/download/v1.14.2/\

kubernetes.tar.gz

tar xf kubernetes.tar.gz && cd kubernetes/cluster/centos/node/bin

cp remove-docker0.sh /app/kubernetes/bin/

scp remove-docker0.sh k8s-node-1:/app/kubernetes/bin/

scp remove-docker0.sh k8s-node-2:/app/kubernetes/bin/

3.9.5 配置flannel

vim /app/kubernetes/cfg/flannel

FLANNEL_ETCD="--etcd-endpoints=https://192.168.189.139:2379,

https://192.168.189.131:2379,https://192.168.189.132:2379"

FLANNEL_ETCD_KEY="--etcd-prefix=/kubernetes/network"

FLANNEL_ETCD_CAFILE="--etcd-cafile=/app/kubernetes/ssl/ca.pem"

FLANNEL_ETCD_CERTFILE="--etcd-certfile=/app/kubernetes/ssl/flanneld.pem"

FLANNEL_ETCD_KEYFILE="--etcd-keyfile=/app/kubernetes/ssl/flanneld-key.pem"

同步到其他节点

scp /app/kubernetes/cfg/flannel k8s-node-1:/app/kubernetes/cfg

scp /app/kubernetes/cfg/flannel k8s-node-2:/app/kubernetes/cfg

3.9.6 设置Flannel系统服务

vim /usr/lib/systemd/system/flannel.service

 

[Unit]

Description=Flanneld overlay address etcd agent

After=network.target

Before=docker.service

 

[Service]

EnvironmentFile=-/app/kubernetes/cfg/flannel

ExecStartPre=/app/kubernetes/bin/remove-docker0.sh

ExecStart=/app/kubernetes/bin/flanneld ${FLANNEL_ETCD} ${FLANNEL_ETCD_KEY} ${FLANNEL_ETCD_CAFILE} ${FLANNEL_ETCD_CERTFILE} ${FLANNEL_ETCD_KEYFILE}

ExecStartPost=/app/kubernetes/bin/mk-docker-apps.sh -d /run/flannel/docker

 

Type=notify

 

[Install]

WantedBy=multi-user.target

RequiredBy=docker.service

由于上面文件的配置ExecStartPost=/app/kubernetes/bin/mk-docker-apps.sh

需要将原来 /app/kubernetes/bin下的mk-docker-opts.sh重命名成mk-docker-apps.sh

mv mk-docker-opts.sh mk-docker-apps.sh

分发启动服务

scp /usr/lib/systemd/system/flannel.service \

k8s-node-1:/usr/lib/systemd/system/flannel.service

 

scp /usr/lib/systemd/system/flannel.service \

k8s-node-2:/usr/lib/systemd/system/flannel.service

3.9.7 flannel cni插件配置

wget https://github.com/containernetworking/plugins/releases/download/\

v0.8.0/cni-plugins-linux-amd64-v0.8.0.tgz

mkdir /app/kubernetes/bin/cni

 

tar -zxf cni-plugins-linux-amd64-v0.8.0.tgz -C /app/kubernetes/bin/cni/

scp -r /app/kubernetes/bin/cni/ k8s-node-1:/app/kubernetes/bin/

scp -r /app/kubernetes/bin/cni/ k8s-node-2:/app/kubernetes/bin/

3.9.8 创建etcd的key

/app/kubernetes/bin/etcdctl --ca-file /app/kubernetes/ssl/ca.pem \

--cert-file /app/kubernetes/ssl/flanneld.pem \

--key-file /app/kubernetes/ssl/flanneld-key.pem \

--no-sync -C https://192.168.189.139:2379,https://192.168.189.131:2379,\

https://192.168.189.132:2379 \

mk /kubernetes/network/config '{ "Network": "10.2.0.0/16", "Backend": { "Type": "vxlan", "VNI": 1 }}' >/dev/null 2>&1

3.9.9 启动flannel

systemctl daemon-reload && systemctl start flannel

systemctl status flannel

3.9.10 修改docker启动服务

vim /usr/lib/systemd/system/docker.service

 

[Unit] #在Unit下面修改After和增加Requires

After=network-online.target firewalld.service flannel.service

Wants=network-online.target

Requires=flannel.service

 

[Service] #增加EnvironmentFile=-/run/flannel/docker

Type=notify

EnvironmentFile=-/run/flannel/docker

ExecStart=/usr/bin/dockerd $DOCKER_OPTS

3.9.11 分发到其它服务器

scp /usr/lib/systemd/system/docker.service \

k8s-node-1:/usr/lib/systemd/system/docker.service

 

scp /usr/lib/systemd/system/docker.service \

k8s-node-2:/usr/lib/systemd/system/docker.service

3.9.12 重启docker

systemctl daemon-reload && systemctl restart docker