1- 环境规划说明
1.1- 系统环境
- 节点信息
节点角色 | 主机名 | IP | cpu | ram | disk | kernel | 组件 |
---|---|---|---|---|---|---|---|
master/worker | master | 192.168.23.135 | 2 | 8G | 80G | kernel-lt-4.4.227 | etcd docker flannel kube-scheduler kube-controller-mananger kube-apiserver kubelet kube-proxy minio nfs docker repository |
worker | node-1 | 192.168.23.136 | 2 | 8G | 80G | kernel-lt-4.4.227 | etcd docker flannel kubelet kube-proxy |
worker | node-2 | 192.168.23.137 | 2 | 8G | 80G | kernel-lt-4.4.227 | etcd docker flannel kubelet kube-proxy |
1.2- 集群架构
1.3- 组件版本
组件 | 版本 | 二进制包下载地址 |
---|---|---|
kubernetes | v1.18.5 | https://dl.k8s.io/v1.18.5/kubernetes-server-linux-amd64.tar.gz |
docker-ce | 18.03 | https://download.docker.com/linux/static/stable/x86_64/docker-18.03.0-ce.tgz |
flannel | 0.11 | https://github.com/coreos/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64.tar.gz |
etcd | 3.3.10 | https://github.com/etcd-io/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz |
mino | https://dl.min.io/server/minio/release/linux-amd64/minio | |
cfssl | 1.12.0 | https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 |
kubernetes-dashboard | 2.0.3 | https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml |
kernel-lt-4.4.227 | 4.4.227 | https://elrepo.org/linux/kernel/el7/x86_64/RPMS/ |
组件百度云下载地址:
2- 环境准备[所有节点]
2.1- 系统环境初始化
- 下载软件包上传到服务器[master]
cd /tmp
[root@master tmp]# ls
k8s-software.tar.gz
- 解压包
tar -xvf k8s-software.tar.gz
ls -l
dr-xr-x--- 2 1001 513 58 Jul 24 18:51 cfssl-1.12.0
-r-xr-x--- 1 1001 513 378880 Jun 26 01:59 codedns.tar.gz
-r-xr-x--- 1 1001 513 7552 Jul 5 18:50 dashboard-v2.0.3.yaml
dr-xr-x--- 2 1001 513 177 Jul 24 18:52 docker-ce-18.03
dr-xr-x--- 2 1001 513 33 Jul 24 18:52 etcd-3.3.10
dr-xr-x--- 2 1001 513 47 Jul 24 18:52 flannel-0.11
-rw-r--r-- 1 root root 1056826368 Jul 25 01:56 k8s-software.tar.gz
-r-xr-x--- 1 1001 513 41209720 Jun 29 10:19 kernel-lt-4.4.227-1.el7.elrepo.x86_64.rpm
-r-xr-x--- 1 1001 513 10711232 Jun 29 10:18 kernel-lt-devel-4.4.227-1.el7.elrepo.x86_64.rpm
dr-xr-x--- 2 1001 513 175 Jul 24 18:52 kubernetes-v.1.18.5
-r-xr-x--- 1 1001 513 4687 Jul 5 19:07 kubernetes-dashboard.yaml
-r-xr-x--- 1 1001 513 227409920 Jul 5 19:07 kubernetesui-dashboard-v2.0.3.tar.gz
-r-xr-x--- 1 1001 513 36961280 Jul 5 19:07 kubernetesui-metrics-scraper-v1.0.4.tar.gz
-r-xr-x--- 1 1001 513 765440 Jun 26 19:31 pause-amd64-3.0.tar.gz
-rw-r--r-- 1 root root 26806784 Jul 25 02:01 registry.tar.gz
- 关闭防火墙和selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
- 禁用swap分区
swapoff -a
sed -i.bak '/ swap / s/^(.*)$/#1/g' /etc/fstab
- 升级内核到4.4版本
wget ##下载内核rpm包
yum localinstall -y kernel-lt-*
sed -i 'ssaved g' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
2.2- 内核参数优化
- 加载内核模块
systemctl enable rc-local
chmod a+x /etc/rc.d/rc.local
systemctl restart rc-local
cat >> /etc/rc.local << EOF
modprobe ip_vs_rr
modprobe br_netfilter
EOF
- 使用systemd-modules-load加载内核模块
cat > /etc/modules-load.d/ipvs.conf << EOF
ip_vs_rr
br_netfilter
EOF
systemctl enable --now systemd-modules-load.service
- 内核参数优化
cat >/etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
sysctl -p /etc/sysctl.d/kubernetes.conf
- 重启系统
reboot
3- 创建自签证书[master节点]
3.1- 创建环境
- 创建环境文件夹
mkdir -p /opt/{etcd,k8s}
mkdir -p /opt/etcd/{bin,tsl,config}
mkdir -p /opt/k8s/{bin,tsl,config}
- 下载cfssl自签工具
cp /tmp/cfssl-1.12.0/cfssl* /usr/sbin/
3.2- 创建etd证书
- 创建ca证书
cd /opt/etcd/tsl/
cfssl print-defaults csr > etcd-ca.json
##修改etcd-ca.json
cat etcd-ca.json
{
"CN": "etcd",
"hosts": [
"192.168.23.135",
"192.168.23.136",
"192.168.23.137",
"127.0.0.1"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Shenzhen",
"ST": "Nanshan"
}
]
}
## 初始化ca-key
cfssl gencert -initca etcd-ca.json |cfssljson -bare etcd-ca -
ls *pem
etcd-ca-key.pem etcd-ca.pem
- 创建颁发集群服务器的证书
cfssl print-defaults csr > etcd-server-csr.json
cat etcd-server-csr.json
{
"CN": "etcd",
"hosts": [
"192.168.23.135",
"192.168.23.136",
"192.168.23.137",
"127.0.0.1"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Shenzhen",
"ST": "Nanshan"
}
]
}
cfssl print-defaults config > etcd-ca-config.json
cat etcd-ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"etcd": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
}
}
}
}
cfssl gencert -ca=etcd-ca.pem -ca-key=etcd-ca-key.pem -config=etcd-ca-config.json --profile=etcd etcd-server-csr.json |cfssljson -bare etcd-server -
ls etcd*server*pem
etcd-server-key.pem etcd-server.pem
3.3- 创建k8s证书
cd /opt/k8s/tsl/
- 创建ca证书
cfssl print-defaults csr > k8s-ca.json
cat k8s-ca.json
{
"CN": "k8s",
"hosts": [
"192.168.23.135",
"192.168.23.136",
"192.168.23.137",
"127.0.0.1"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Shenzhen",
"ST": "Nanshan"
}
]
}
cfssl gencert -initca k8s-ca.json |cfssljson -bare k8s-ca -
cfssl print-defaults config > k8s-ca-config.json
cat k8s-ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"k8s": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
}
}
}
}
- 创建kube-apiserver证书
cfssl print-defaults csr > k8s-apiserver.json
cat k8s-apiserver.json
{
"CN": "k8s",
"hosts": [
"127.0.0.1",
"192.168.23.135",
"192.168.23.136",
"192.168.23.137",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.k8s",
"kubernetes.default.svc.k8s.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Shenzhen",
"ST": "Nanshan",
"O": "k8s",
"OU": "System"
}
]
}
cfssl gencert -ca=k8s-ca.pem -ca-key=k8s-ca-key.pem -config=k8s-ca-config.json -profile=k8s k8s-apiserver.json |cfssljson -bare k8s-apiserver -
ls k8s-apiserver*pem
k8s-apiserver-key.pem k8s-apiserver.pem
- 创建k8s-apiserver证书
cfssl print-defaults csr > k8s-proxy.json
cat k8s-proxy.json
{
"CN": "k8s",
"hosts": [
"127.0.0.1",
"192.168.23.135",
"192.168.23.136",
"192.168.23.137"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Shenzhen",
"ST": "Nanshan",
"O": "k8s",
"OU": "System"
}
]
}
cfssl gencert -ca=k8s-ca.pem -ca-key=k8s-ca-key.pem -config=k8s-ca-config.json -profile=k8s k8s-proxy.json |cfssljson -bare k8s-proxy -
ls k8s-proxy*pem
k8s-proxy-key.pem k8s-proxy.pem
4- 安装etcd集群[master节点]
4.1- 创建集群文件
- 下载上传etcd二进制文件[master节点]
hostnamectl set-hostname master
cp /tmp/etcd-3.3.10/etcd* /opt/etcd/bin/
cd /opt/etcd/bin/
[root@master bin]# ls
etcd etcdctl
- 创建etcd配置文件
vim /opt/etcd/config/etcd.cfg
#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.23.135:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.23.135:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.23.135:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.23.135:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.23.135:2380,etcd02=https://192.168.23.136:2380,etcd03=https://192.168.23.137:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
- 创建 etcd的 systemd unit 文件
[root@master bin]# cat /opt/etcd/config/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/opt/etcd/config/etcd.cfg
ExecStart=/opt/etcd/bin/etcd
--name=${ETCD_NAME}
--data-dir=${ETCD_DATA_DIR}
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS}
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS}
--initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS}
--initial-cluster=${ETCD_INITIAL_CLUSTER}
--initial-cluster-token=${ETCD_INITIAL_CLUSTER_TOKEN}
--initial-cluster-state=new
--cert-file=/opt/etcd/tsl/etcd-server.pem
--key-file=/opt/etcd/tsl/etcd-server-key.pem
--peer-cert-file=/opt/etcd/tsl/etcd-server.pem
--peer-key-file=/opt/etcd/tsl/etcd-server-key.pem
--trusted-ca-file=/opt/etcd/tsl/etcd-ca.pem
--peer-trusted-ca-file=/opt/etcd/tsl/etcd-ca.pem
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
4.2- 启动集群
- 配置文件拷贝到 node-1,node-2[master节点]
scp -r /opt/etcd/ root@192.168.23.136:/opt/
scp -r /opt/etcd/ root@192.168.23.137:/opt/
- 拷贝systemd服务器文件[master节点]
ln -s /opt/etcd/config/etcd.service /usr/lib/systemd/system/etcd.service
- 修改另外两台机器配置文件[node1节点]
hostnamectl set-hostname node-1
[root@node-1 ~]# cat /opt/etcd/config/etcd.cfg
#[Member]
ETCD_NAME="etcd02"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.23.136:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.23.136:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.23.136:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.23.136:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.23.135:2380,etcd02=https://192.168.23.136:2380,etcd03=https://192.168.23.137:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
- 修改另外两台机器配置文件[node-2节点]
hostnamectl set-hostname node-2
[root@node-2 ~]# cat /opt/etcd/config/etcd.cfg
#[Member]
ETCD_NAME="etcd03"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.23.137:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.23.137:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.23.137:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.23.137:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.23.135:2380,etcd02=https://192.168.23.136:2380,etcd03=https://192.168.23.137:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
ln -s /opt/etcd/config/etcd.service /usr/lib/systemd/system/etcd.service
- 启动etcd服务[所有节点]
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
#启动ETCD集群同时启动二个节点,单节点是无法正常启动的。
- 检查集群服务健康[任意节点]
[root@master bin]# /opt/etcd/bin/etcdctl --ca-file=/opt/etcd/tsl/etcd-ca.pem --cert-file=/opt/etcd/tsl/etcd-server.pem --key-file=/opt/etcd/tsl/etcd-server-key.pem --endpoints="https://192.168.23.135:2379,https:/192.168.23.136:2379,https://192.168.23.137:2379" cluster-health
member f605c94d9a81d1 is healthy: got healthy result from https://192.168.23.136:2379
member 1d4ca791a3f37e9a is healthy: got healthy result from https://192.168.23.135:2379
member 50da4142886026dc is healthy: got healthy result from https://192.168.23.137:2379
cluster is healthy
- 检查集群成员[任意节点]
[root@master bin]# /opt/etcd/bin/etcdctl --ca-file=/opt/etcd/tsl/etcd-ca.pem --cert-file=/opt/etcd/tsl/etcd-server.pem --key-file=/opt/etcd/tsl/etcd-server-key.pem --endpoints="https://192.168.23.135:2379,https:/192.168.23.136:2379,https://192.168.23.137:2379" member list
f605c94d9a81d1: name=etcd02 peerURLs=https://192.168.23.136:2380 clientURLs=https://192.168.23.136:2379 isLeader=false
1d4ca791a3f37e9a: name=etcd01 peerURLs=https://192.168.23.135:2380 clientURLs=https://192.168.23.135:2379 isLeader=true
50da4142886026dc: name=etcd03 peerURLs=https://192.168.23.137:2380 clientURLs=https://192.168.23.137:2379 isLeader=false
5- 安装容器环境组件[master节点]
5.1- 安装flanneld组件
- 向 etcd 写入集群 Pod 网段信息
pod网络规划为:172.10.0.0/16
[root@master bin]# /opt/etcd/bin/etcdctl --ca-file=/opt/etcd/tsl/etcd-ca.pem --cert-file=/opt/etcd/tsl/etcd-server.pem --key-file=/opt/etcd/tsl/etcd-server-key.pem --endpoints="https://192.168.23.135:2379,https:/192.168.23.136:2379,https://192.168.23.137:2379" set /k8s-pod/network/config '{"Network":"172.10.0.0/16","Backend":{"Type":"vxlan"}}'
{"Network":"172.10.0.0/16","Backend":{"Type":"vxlan"}}
参数说明:写入的 Pod 网段 ${CLUSTER_CIDR} 必须是 /16 段地址,必须与 kube-controller-manager 的 --cluster-cidr 参数值一致;
- 创建flannel配置二进制文件
mkdir -p /opt/flanneld/{bin,config}
cp /tmp/flannel-0.11/* /opt/flannel/bin/
cd /opt/flanneld/bin
[root@master bin]# ls
flanneld mk-docker-opts.sh
- 创建flannel配置文件
vim /opt/flanneld/config/flenneld.cfg
FLANNEL_OPTIONS="-etcd-cafile=/opt/etcd/tsl/etcd-ca.pem
-etcd-certfile=/opt/etcd/tsl/etcd-server.pem
-etcd-keyfile=/opt/etcd/tsl/etcd-server-key.pem
-iface=ens33
-etcd-prefix=/k8s-pod/network
-etcd-endpoints=https://192.168.23.135:2379,https://192.168.23.136:2379,https://192.168.23.137:2379"
- 创建flanneld 的 systemd unit 文件
vim /opt/flanneld/config/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/opt/flannel/config/flanneld.cfg
ExecStart=/opt/flannel/bin/flanneld --ip-masq $FLANNEL_OPTIONS
ExecStartPost=/opt/flannel/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure
[Install]
WantedBy=multi-user.target
ln -s /opt/flannel/config/flanneld.service /usr/lib/systemd/system/flanneld.service
写入的 Pod 网段 ${CLUSTER_CIDR} 必须是 /16 段地址,必须与 kube-controller-manager 的 --cluster-cidr 参数值一致;
- 拷贝配置文件到各节点
scp -r /opt/flannel/ root@192.168.23.136:/opt/ [master]
scp -r /opt/flannel/ root@192.168.23.137:/opt/ [master]
ln -s /opt/flannel/config/flanneld.service /usr/lib/systemd/system/flanneld.service
ln -s /opt/flannel/config/flanneld.service /usr/lib/systemd/system/flanneld.service
- 启动flannel[所有几点]
systemctl daemon-reload
systemctl restart flanneld
systemctl enable flanneld
5.2- 安装docker-ce 18.03[master节点]
- 下载二进制包
mkdir -p /opt/docker/config/
cp /tmp/docker-ce-18.03/docker* /usr/sbin/
- 创建的 systemd unit 文件
vim /opt/docker/config/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/run/flannel/subnet.env
ExecStart=/usr/sbin/dockerd $DOCKER_NETWORK_OPTIONS
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
- 配置docker参数
cat > daemon.json <<EOF
{
"registry-mirrors": ["https://wbuj86p5.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
- 拷贝二进制和配置文件到其他节点
scp /usr/sbin/docker* root@192.168.23.136:/usr/sbin/
scp /usr/sbin/docker* root@192.168.23.137:/usr/sbin/
scp -r /opt/docker/ root@192.168.23.136:/opt/
scp -r /opt/docker/ root@192.168.23.137:/opt/
- 启动docker服务[所有节点]
mkdir -p /etc/docker/
ln -s /opt/docker/config/daemon.json /etc/docker/daemon.json
ln -s /opt/docker/config/docker.service /usr/lib/systemd/system/docker.service
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
5.3- 检查验证flanneld和docker服务[所有节点]
- flanneld
[root@node-1 ~]# ifconfig flannel.1|grep inet
inet 172.10.14.0 netmask 255.255.255.255 broadcast 0.0.0.0
- docker网桥
[root@node-1 ~]# ifconfig docker0|grep inet
inet 172.10.14.1 netmask 255.255.255.0 broadcast 172.10.14.255
- docker info
[root@node-1 ~]# docker info|egrep 'Cgroup|Network'
Cgroup Driver: systemd
Network: bridge host macvlan null overlay
至此所有非k8s的组件环境安装完成!
检查所有服务必须正常
- node-1
[root@node-1 ~]# systemctl status etcd flanneld docker|grep running
Active: active (running) since Thu 2020-07-23 15:54:10 CST; 7min ago
Active: active (running) since Thu 2020-07-23 15:54:10 CST; 7min ago
Active: active (running) since Thu 2020-07-23 15:54:11 CST; 7min ago
- node-2
[root@master ~]# systemctl status etcd flanneld docker|grep running
Active: active (running) since Thu 2020-07-23 15:54:08 CST; 8min ago
Active: active (running) since Thu 2020-07-23 15:54:08 CST; 8min ago
Active: active (running) since Thu 2020-07-23 15:54:09 CST; 8min ago
- master
[root@node-2 ~]# systemctl status etcd flanneld docker|grep running
Active: active (running) since Thu 2020-07-23 15:54:08 CST; 8min ago
Active: active (running) since Thu 2020-07-23 15:54:08 CST; 8min ago
Active: active (running) since Thu 2020-07-23 15:54:09 CST; 8min ago
6- 安装master节点组件[master]
kubernetes master 节点运行如下组件:
kube-apiserver
kube-scheduler
kube-controller-manager
kube-scheduler 和 kube-controller-manager 可以以集群模式运行,通过 leader 选举产生一个工作进程,其它进程处于阻塞模式。
6.1- 安装 kube-apiserver 组件
- 创建 TLS Bootstrapping Token
cd /opt/k8s/config/
[root@master config]# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
2c1e270afcd5440611fd76ee3faab593
vim k8s-token.csv
2c1e270afcd5440611fd76ee3faab593,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
- 创建apiserver配置文件
vim kube-apiserver.cfg
KUBE_APISERVER_OPTS="--logtostderr=true
--v=4
--etcd-servers=https://192.168.23.135:2379,https://192.168.23.136:2379,https://192.168.23.137:2379
--bind-address=192.168.23.135
--secure-port=6443
--advertise-address=192.168.23.135
--allow-privileged=true
--service-cluster-ip-range=10.0.0.0/24
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota,NodeRestriction
--authorization-mode=RBAC,Node
--enable-bootstrap-token-auth
--token-auth-file=/opt/k8s/config/k8s-token.csv
--service-node-port-range=30000-50000
--tls-cert-file=/opt/k8s/tsl/k8s-apiserver.pem
--tls-private-key-file=/opt/k8s/tsl/k8s-apiserver-key.pem
--client-ca-file=/opt/k8s/tsl/k8s-ca.pem
--service-account-key-file=/opt/k8s/tsl/k8s-ca-key.pem
--etcd-cafile=/opt/etcd/tsl/etcd-ca.pem
--etcd-certfile=/opt/etcd/tsl/etcd-server.pem
--etcd-keyfile=/opt/etcd/tsl/etcd-server-key.pem"
- 创建 kube-apiserver systemd unit 文件
vim kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/opt/k8s/config/kube-apiserver.cfg
ExecStart=/opt/k8s/bin/kube-apiserver $KUBE_APISERVER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 拷贝二进制文件
cp /tmp/kubernetes-v.1.18.5/kube-apiserver /opt/k8s/bin/
- 启动服务
ln -s /opt/k8s/config/kube-apiserver.service /usr/lib/systemd/system/kube-apiserver.service
systemctl daemon-reload
systemctl enable kube-apiserver
systemctl restart kube-apiserver
- 检查服务运行情况
ps: 如果出现错误则先处理错误后在部署下一个组件。
[root@master config]# systemctl status kube-apiserver
● kube-apiserver.service - Kubernetes API Server
Loaded: loaded (/opt/k8s/config/kube-apiserver.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-07-23 17:07:25 CST; 5min ago
Docs: https://github.com/kubernetes/kubernetes
Main PID: 4911 (kube-apiserver)
CGroup: /system.slice/kube-apiserver.service
└─4911 /opt/k8s/bin/kube-apiserver --logtostderr=true --v=4 --etcd-servers=https://192.168.23.135:2379,https://192.168.23.136:2379,https://192.168.23.137:2379 --bind-addre...
6.2- 部署kube-scheduler
- 创建kube-scheduler配置文件
vim kube-scheduler.cfg
KUBE_SCHEDULER_OPTS="--logtostderr=true --v=4 --master=127.0.0.1:8080 --leader-elect"
--address:在 127.0.0.1:10251 端口接收 http /metrics 请求;kube-scheduler 目前还不支持接收 https 请求;
- 创建kube-scheduler systemd unit 文件
vim kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/opt/k8s/config/kube-scheduler.cfg
ExecStart=/opt/k8s/bin/kube-scheduler $KUBE_SCHEDULER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 拷贝二进制文件
cp /tmp/kubernetes-v.1.18.5/kube-scheduler /opt/k8s/bin/
- 启动服务
ln -s /opt/k8s/config/kube-scheduler.service /usr/lib/systemd/system/kube-scheduler.service
systemctl daemon-reload
systemctl start kube-scheduler
systemctl enable kube-scheduler
- 检查服务
[root@master config]# systemctl status kube-scheduler
● kube-scheduler.service - Kubernetes Scheduler
Loaded: loaded (/opt/k8s/config/kube-scheduler.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-07-23 17:21:01 CST; 32s ago
Docs: https://github.com/kubernetes/kubernetes
Main PID: 6008 (kube-scheduler)
CGroup: /system.slice/kube-scheduler.service
└─6008 /opt/k8s/bin/kube-scheduler --logtostderr=true --v=4 --master=127.0.0.1:8080 --leader-elect
6.3- 安装kube-controller-manager
- 创建kube-controller-manager配置文件
vim kube-controller-manager.cfg
KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=true
--v=4
--master=127.0.0.1:8080
--leader-elect=true
--address=127.0.0.1
--service-cluster-ip-range=10.0.0.0/24
--cluster-name=kubernetes
--cluster-signing-cert-file=/opt/k8s/tsl/k8s-ca.pem
--cluster-signing-key-file=/opt/k8s/tsl/k8s-ca-key.pem
--root-ca-file=/opt/k8s/tsl/k8s-ca.pem
--service-account-private-key-file=/opt/k8s/tsl/k8s-ca-key.pem"
- 创建systemd unit 文件
vim kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/opt/k8s/config/kube-controller-manager.cfg
ExecStart=/opt/k8s/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 拷贝二进制文件
cp /tmp/kubernetes-v.1.18.5/kube-controller-manager /opt/k8s/bin/
- 启动服务
ln -s /opt/k8s/config/kube-controller-manager.service /usr/lib/systemd/system/kube-controller-manager.service
systemctl daemon-reload
systemctl start kube-controller-manager
systemctl enable kube-controller-manager
- 检查服务
[root@master config]# systemctl status kube-controller-manager
● kube-controller-manager.service - Kubernetes Controller Manager
Loaded: loaded (/opt/k8s/config/kube-controller-manager.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-07-23 17:45:16 CST; 30s ago
Docs: https://github.com/kubernetes/kubernetes
Main PID: 7891 (kube-controller)
CGroup: /system.slice/kube-controller-manager.service
└─7891 /opt/k8s/bin/kube-controller-manager --logtostderr=true --v=4 --master=127.0.0.1:8080 --leader-elect=true --address=127.0...
6.4- 检查集群状态
cp /tmp/kubernetes-v.1.18.5/kubectl /usr/sbin/
[root@master config]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-2 Healthy {"health":"true"}
etcd-0 Healthy {"health":"true"}
etcd-1 Healthy {"health":"true"}
ps: master节点组件部署完成,此时建议多次重启系统检查服务是否正常,否则需要检查修复后再部署node节点组件。
7- 安装node节点组件
kubernetes node 节点运行如下组件:
kubelet
kube-proxy
7.1- 部署 kubelet 组件
kublet 运行在每个 worker 节点上,接收 kube-apiserver 发送的请求,管理 Pod 容器,执行交互式命令,如exec、run、logs 等;
kublet 启动时自动向 kube-apiserver 注册节点信息,内置的 cadvisor 统计和监控节点的资源使用情况;
为确保安全,只开启接收 https 请求的安全端口,对请求进行认证和授权,拒绝未授权的访问(如apiserver、heapster)。
7.1.1- 创建 kubelet bootstrap.kubeconfig 文件[master节点]
- 设置变量
mkdir -p /opt/k8s-node/{bin,tsl,config}
cd /opt/k8s-node/config/
export BOOTSTRAP_TOKEN=2c1e270afcd5440611fd76ee3faab593
export KUBE_APISERVER="https://192.168.23.135:6443"
- 设置集群参数
kubectl config set-cluster kubernetes
--certificate-authority=/opt/k8s/tsl/k8s-ca.pem
--embed-certs=true
--server=${KUBE_APISERVER}
--kubeconfig=./bootstrap.kubeconfig
- 设置客户端认证参数
kubectl config set-credentials kubelet-bootstrap
--token=${BOOTSTRAP_TOKEN}
--kubeconfig=./bootstrap.kubeconfig
- 设置上下文参数
kubectl config set-context default
--cluster=kubernetes
--user=kubelet-bootstrap
--kubeconfig=./bootstrap.kubeconfig
- 使用上下文参数
kubectl config use-context default --kubeconfig=./bootstrap.kubeconfig
7.1.2- 创建 kubelet.kubeconfig 文件
- 设置集群参数
kubectl config set-cluster kubernetes
--certificate-authority=/opt/k8s/tsl/k8s-ca.pem
--embed-certs=true --server=${KUBE_APISERVER}
--kubeconfig=./kubelet.kubeconfig
- 设置客户端认证参数
kubectl config set-credentials kubelet
--token=${BOOTSTRAP_TOKEN}
--kubeconfig=./kubelet.kubeconfig
- 设置上下文参数
kubectl config set-context default
--cluster=kubernetes
--user=kubelet
--kubeconfig=./kubelet.kubeconfig
- 使用上下文参数
kubectl config use-context default --kubeconfig=./kubelet.kubeconfig
7.1.3 安装kubelet进程组件
- 创建kubelet.env 参数配置文件
cd /opt/k8s-node/config
vim kubelet.env
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 192.168.23.136
port: 10250
readOnlyPort: 10255
cgroupDriver: systemd
clusterDomain: k8s.local.
failSwapOn: false
authentication:
anonymous:
enabled: true
PS: cgroupDriver 类型必须与docker设置的一样,否则会导致approve后kubele会进程推出
- 创建kubelet.cfg服务配置文件
vim kubelet.cfg
KUBELET_OPTS="--logtostderr=true
--v=4
--hostname-override=node-1
--kubeconfig=/opt/k8s-node/config/kubelet.kubeconfig
--bootstrap-kubeconfig=/opt/k8s-node/config/bootstrap.kubeconfig
--config=/opt/k8s-node/config/kubelet.env
--cert-dir=/opt/k8s-node/tsl/
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
- 创建kubelet systemd unit 文件
vim kubelet.service
[Unit]
Description=Kubernetes Kubelet
Requires=docker.service
After=docker.service
[Service]
EnvironmentFile=/opt/k8s-node/config/kubelet.cfg
ExecStart=/opt/k8s-node/bin/kubelet $KUBELET_OPTS
Restart=on-failure
KillMode=process
[Install]
WantedBy=multi-user.target
- 将kubelet-bootstrap用户绑定到系统集群角色
kubectl create clusterrolebinding kubelet-bootstrap
--clusterrole=system:node-bootstrapper
--user=kubelet-bootstrap
- 拷贝二进制文件
cp /tmp/kubernetes-v.1.18.5/kubelet /opt/k8s-node/bin/kube
- 拷贝配置文件到node节点
scp -r /opt/k8s-node/ root@192.168.23.136:/opt/
scp -r /opt/k8s-node/ root@192.168.23.137:/opt/
- 启动服务[node节点]
ln -s /opt/k8s-node/config/kubelet.service /usr/lib/systemd/system/kubelet.service
systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet
7.1.4- approve kubelet CSR 请求[master节点]
- 查看获取到到请求
[root@master config]# kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-OcSB30Vo3Gge_tX3OM5uuINwkkCYgzaW0y5FcVZGiRI 2m20s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
node-csr-bG5qkwBn7kllVT_E21pV-gDZ35hlEvy6q_16PWXSr00 64s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
- approve请求
kubectl certificate approve node-csr-OcSB30Vo3Gge_tX3OM5uuINwkkCYgzaW0y5FcVZGiRI
kubectl certificate approve node-csr-bG5qkwBn7kllVT_E21pV-gDZ35hlEvy6q_16PWXSr00
- 查看approve后的结果
[root@master config]# kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-OcSB30Vo3Gge_tX3OM5uuINwkkCYgzaW0y5FcVZGiRI 4m41s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued
node-csr-bG5qkwBn7kllVT_E21pV-gDZ35hlEvy6q_16PWXSr00 3m25s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued
- csr 状态变为 Approved,Issued 即可
- Requesting User:请求 CSR 的用户,kube-apiserver 对它进行认证和授权;
- Subject:请求签名的证书信息;
- 证书的 CN 是 system:node:kube-node2, Organization 是 system:nodes,kube-apiserver 的 Node 授权模式会授予该证书的相关权限;
- 查看服务状态
[root@master ~]# kubectl get node,cs
NAME STATUS ROLES AGE VERSION
node/node-1 Ready <none> 40m v1.18.5
node/node-2 Ready <none> 42m v1.18.5
NAME STATUS MESSAGE ERROR
componentstatus/controller-manager Healthy ok
componentstatus/scheduler Healthy ok
componentstatus/etcd-2 Healthy {"health":"true"}
componentstatus/etcd-1 Healthy {"health":"true"}
componentstatus/etcd-0 Healthy {"health":"true"}
7.2- 安装kube-proxy组件
kube-proxy 运行在所有 node节点上,它监听 apiserver 中 service 和 Endpoint 的变化情况,创建路由规则来进行服务负载均衡。
7.2.1- 创建kube-proxy kubeconfig文件[master]
- 设置集群参数
cd /opt/k8s-node/config/
export BOOTSTRAP_TOKEN=2c1e270afcd5440611fd76ee3faab593
export KUBE_APISERVER="https://192.168.23.135:6443"
kubectl config set-cluster kubernetes
--certificate-authority=/opt/k8s/tsl/k8s-ca.pem
--embed-certs=true
--server=${KUBE_APISERVER}
--kubeconfig=./kube-proxy.kubeconfig
- 设置客户端认证参数
kubectl config set-credentials kube-proxy
--client-certificate=/opt/k8s/tsl/k8s-proxy.pem
--client-key=/opt/k8s/tsl/k8s-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
7.2.2- 创建配置文件
- 创建kube-proxy配置文件
vim kube-proxy.cfg
KUBE_PROXY_OPTS="--logtostderr=true
--v=4
--hostname-override=node-1
--cluster-cidr=10.0.0.0/24
--kubeconfig=/opt/k8s-node/config/kube-proxy.kubeconfig"
--cluster-cidr=10.0.0.0/24 集群service网络
- 创建kube-proxy systemd unit 文件
vim kube-proxy.service
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=/opt/k8s-node/config/kube-proxy.cfg
ExecStart=/opt/k8s-node/bin/kube-proxy $KUBE_PROXY_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
7.2.3- 启动服务
- 拷贝二进制文件
cp /tmp/kubernetes-v.1.18.5/kube-proxy /opt/k8s-node/bin/
- 拷贝配置文件到node节点
scp /opt/k8s-node/bin/kube-proxy root@192.168.23.136:/opt/k8s-node/bin/
scp /opt/k8s-node/bin/kube-proxy root@192.168.23.137:/opt/k8s-node/bin/
scp /opt/k8s-node/config/kube-proxy.* root@192.168.23.136:/opt/k8s-node/config/
scp /opt/k8s-node/config/kube-proxy.* root@192.168.23.137:/opt/k8s-node/config/
- 启动进程
ln -s /opt/k8s-node/config/kube-proxy.service /usr/lib/systemd/system/kube-proxy.service
systemctl daemon-reload
systemctl enable kube-proxy
systemctl restart kube-proxy
7.2.4- 检查服务状态
- master
[root@master config]# systemctl status kube-proxy
● kube-proxy.service - Kubernetes Proxy
Loaded: loaded (/opt/k8s-node/config/kube-proxy.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2020-07-24 07:16:43 CST; 1min 31s ago
- node-1
Hint: Some lines were ellipsized, use -l to show in full.
[root@node-1 k8s-node]# systemctl status kube-proxy
● kube-proxy.service - Kubernetes Proxy
Loaded: loaded (/opt/k8s-node/config/kube-proxy.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2020-07-24 06:18:44 CST; 58min ago
Main PID: 32609 (kube-proxy)
- node-2
[root@node-2 ~]# systemctl status kube-proxy
● kube-proxy.service - Kubernetes Proxy
Loaded: loaded (/opt/k8s-node/config/kube-proxy.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2020-07-24 06:21:04 CST; 55min ago
Main PID: 32682 (kube-proxy)
Tasks: 7
Memory: 16.5M
CGroup: /system.slice/kube-proxy.service
ps:此时K8S集群部署完成,建议多次重启服务器验证集群服务情况