一、理论概述
Kubernetes 是什么?
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。
Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。
时光回溯
让我们回顾一下为何 Kubernetes 能够裨益四方。
传统部署时代:
早期,各机构是在物理服务器上运行应用程序。 由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。 例如,如果在物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程式资源利用率不高时,剩余资源无法被分配给其他应用程式, 而且维护许多物理服务器的成本很高。
虚拟化部署时代:
因此,虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。
虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可伸缩性,以及降低硬件成本等等的好处。
每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统(OS)。
容器部署时代:
容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。
容器因具有许多优势而变得流行起来。下面列出的是容器的一些好处:
控制平面组件(Control Plane Components)
控制平面组件会为集群做出全局决策,比如资源的调度。 以及检测和响应集群事件,例如当不满足部署的 replicas 字段时, 要启动新的 pod)。
控制平面组件可以在集群中的任何节点上运行。 然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件, 并且不会在此计算机上运行用户容器。 请参阅使用 kubeadm 构建高可用性集群 中关于跨多机器控制平面设置的示例。
kube-apiserver
API 服务器是 Kubernetes 控制平面的组件, 该组件负责公开了 Kubernetes API,负责处理接受请求的工作。 API 服务器是 Kubernetes 控制平面的前端。
Kubernetes API 服务器的主要实现是 kube-apiserver。 kube-apiserver 设计上考虑了水平扩缩,也就是说,它可通过部署多个实例来进行扩缩。 你可以运行 kube-apiserver 的多个实例,并在这些实例之间平衡流量。
etcd
etcd 是兼顾一致性与高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。
你的 Kubernetes 集群的 etcd 数据库通常需要有个备份计划。
如果想要更深入的了解 etcd,请参考 etcd 文档。
kube-scheduler
kube-scheduler 是控制平面的组件, 负责监视新创建的、未指定运行节点(node)的 Pods, 并选择节点来让 Pod 在上面运行。
调度决策考虑的因素包括单个 Pod 及 Pods 集合的资源需求、软硬件及策略约束、 亲和性及反亲和性规范、数据位置、工作负载间的干扰及最后时限。
kube-controller-manager
kube-controller-manager 是控制平面的组件, 负责运行控制器进程。
从逻辑上讲, 每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在同一个进程中运行。
这些控制器包括:
4.关闭交换分区
swapoff -a
&& sed -ri ‘s/.swap./#&/’ /etc/fstab
##低版本内核可能不稳定所以先更新内核[三台cnetos]
1.安装epel源
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum -y update
2.查看内核版本并安装最新内核版本
yum --disablerepo="" --enablerepo=“elrepo-kernel” list available
3.安装最新it内核
yum --disablerepo='’ --enablerepo=elrepo-kernel install kernel-lt -y
4.指定新安装的内核版本为默认启动内核
grub2-set-default 0
5.卸载旧版内核并重启机器
yum remove kernel -y //可选
reboot
6.加载模块并添加v4流量传递
modprobe br_netfilter
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
7.安装ipvs
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
cat > /etc/sysconfig/modules/ipvs.modules <
modprobe – ip_vs
modprobe – ip_vs_rr
modprobe – ip_vs_wrr
modprobe – ip_vs_sh
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
lsmod | grep -e ip_vs -e nf_conntrack
二、部署Docker环境(三台主机)
cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list | grep containerd
yum install -y containerd.io docker-ce docker-ce-cli
mkdir /etc/containerd -p
containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml
SystemdCgroup = false 改为 SystemdCgroup = true
改为:
sandbox_image = “registry.aliyuncs.com/google_containers/pause:3.6”
systemctl enable containerd && systemctl start containerd
ctr version
runc -version
三、部署Kubernetns集群(三台主机)
YUM源
cat <> /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装kubelet、kubeadm和kubectl
yum install -y --nogpgcheck kubelet kubeadm kubectl
systemctl enable kubelet
生成初始化配置文件(master)
kubeadm config print init-defaults > init-config.yaml
常用功能:
kubeadm config view: 查看当前集群中的配置值。
kubeadm config print join-defaults: 输出 kubeadm join 默认参数文件的内容。
kubeadm config images list: 列出所需的镜像列表。
kubeadm config images pull: 拉取镜像到本地。
kubeadm config upload from-flags: 由配置参数生成 ConfigMap。
修改配置文件
vim init-config.yaml
advertiseAddress: 192.168.180.190
name: k8s-master
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
podSubnet: 10.244.0.0/16
拉取所需镜像
kubeadm config images list --config init-config.yaml
列出所需的镜像列表
registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.0
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.0
registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.0
registry.aliyuncs.com/google_containers/kube-proxy:v1.22.0
registry.aliyuncs.com/google_containers/pause:3.5
registry.aliyuncs.com/google_containers/etcd:3.5.0-0
registry.aliyuncs.com/google_containers/coredns:v1.8.4
kubeadm config images pull --config=init-config.yaml
这里可能会报错
failed to pull image “registry.aliyuncs.com/google_containers/coredns:v1.8.4”: output: Error response from daemon: manifest for registry.aliyuncs.com/google_containers/coredns:v1.8.4 not found: manifest unknown: manifest unknown
解决方法:
docker pull registry.aliyuncs.com/google_containers/coredns:1.8.4
docker tag registry.aliyuncs.com/google_containers/coredns:1.8.4 registry.aliyuncs.com/google_containers/coredns:v1.8.4
解决方法:
rm -rf /etc/containerd/config.toml && systemctl restart containerd
初始化k8s-master
kubeadm init --config=init-config.yaml
根据提示复制配置文件到用户的home目录,并将node节点加入集群
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown ( i d − u ) : (id -u): (id−u):(id -g) $HOME/.kube/config
在k8s-master查看节点
kubectl get nodes
部署calico网络[master]
wget https://docs.projectcalico.org/v3.18/manifests/calico.yaml
vim calico.yaml //3673行修改为如下
二进制安装:
基本环境准备:
主机名、hosts文件、添加DNS
安装Docker(三台主机)
yum -y install iptable* wget telnet lsof vim rsync lrzsz net-tools unzip
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum -y install docker-ce
mkdir /etc/docker/
cat << EOF > /etc/docker/daemon.json
{
“registry-mirrors”:[“https://registry.docker-cn.com”]
}
EOF
systemctl enable docker
systemctl start docker
设置防火墙(三台主机)
systemctl stop firewalld
systemctl disable firewalld
systemctl start iptables
iptables -F
iptables -I INPUT -s 192.168.0.0/16 -j ACCEPT
禁用selinux
生成通信加密证书(master)
生成CA证书
mkdir -p /root/software/ssl
cd /root/software/ssl/
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
chmod +x *
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
拷贝证书生成脚本
cat > ca-config.json <
“signing”: {
“default”: {
“expiry”: “87600h”
},
“profiles”: {
“kubernetes”: {
“expiry”: “87600h”,
“usages”: [
“signing”,
“key encipherment”,
“server auth”,
“client auth”
]
}
}
}
}
EOF
cat > ca-csr.json <
“CN”: “kubernetes”,
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“L”: “Beijing”,
“ST”: “Beijing”,
“O”: “k8s”,
“OU”: “System”
}
]
}
EOF
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
cat << EOF >server-csr.json
{
“CN”: “kubernetes”,
“hosts”: [
“127.0.0.1”,
“192.168.107.201”,
“192.168.107.202”,
“192.168.107.203”,
“10.10.10.1”,
“kubernetes”,
“kubernetes.default”,
“kubernetes.default.svc”,
“kubernetes.default.svc.cluster”,
“kubernetes.default.svc.cluster.local”
],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“L”: “BeiJing”,
“ST”: “BeiJing”,
“O”: “k8s”,
“OU”: “System”
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
cat > admin-csr.json <
“CN”: “admin”,
“hosts”: [],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“L”: “BeiJing”,
“ST”: “BeiJing”,
“O”: “system:masters”,
“OU”: “System”
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
cat > kube-proxy-csr.json <
“CN”: “system:kube-proxy”,
“hosts”: [],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“L”: “BeiJing”,
“ST”: “BeiJing”,
“O”: “k8s”,
“OU”: “System”
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
ls | grep -v pem | xargs -i rm {}
部署ETCD集群
mkdir /opt/kubernetes
mkdir /opt/kubernetes/{bin,cfg,ssl}
tar zxf etcd-v3.3.18-linux-amd64.tar.gz
cd etcd-v3.3.18-linux-amd64/
mv etcd /opt/kubernetes/bin/
mv etcdctl /opt/kubernetes/bin/
在k8s-master部署ETCD节点
vim /opt/kubernetes/cfg/etcd
#[Member]
ETCD_NAME=“etcd01”
ETCD_DATA_DIR=“/var/lib/etcd/default.etcd”
ETCD_LISTEN_PEER_URLS=“https://192.168.107.201:2380”
ETCD_LISTEN_CLIENT_URLS=“https://192.168.107.201:2379”
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS=“https://192.168.107.201:2380”
ETCD_ADVERTISE_CLIENT_URLS=“https://192.168.107.201:2379”
ETCD_INITIAL_CLUSTER=“etcd01=https://192.168.107.201:2380,etcd02=https://192.168.107.202:2380,etcd03=https://192.168.107.203:2380”
ETCD_INITIAL_CLUSTER_TOKEN=“etcd-cluster”
ETCD_INITIAL_CLUSTER_STATE=“new”
vim /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=-/opt/kubernetes/cfg/etcd
ExecStart=/opt/kubernetes/bin/etcd
–name= E T C D N A M E − − d a t a − d i r = {ETCD_NAME} --data-dir= ETCDNAME−−data−dir={ETCD_DATA_DIR}
–listen-peer-urls= E T C D L I S T E N P E E R U R L S − − l i s t e n − c l i e n t − u r l s = {ETCD_LISTEN_PEER_URLS} --listen-client-urls= ETCDLISTENPEERURLS−−listen−client−urls={ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379
–advertise-client-urls= E T C D A D V E R T I S E C L I E N T U R L S − − i n i t i a l − a d v e r t i s e − p e e r − u r l s = {ETCD_ADVERTISE_CLIENT_URLS} --initial-advertise-peer-urls= ETCDADVERTISECLIENTURLS−−initial−advertise−peer−urls={ETCD_INITIAL_ADVERTISE_PEER_URLS}
–initial-cluster= E T C D I N I T I A L C L U S T E R − − i n i t i a l − c l u s t e r − t o k e n = {ETCD_INITIAL_CLUSTER} --initial-cluster-token= ETCDINITIALCLUSTER−−initial−cluster−token={ETCD_INITIAL_CLUSTER}
–initial-cluster-state=new
–cert-file=/opt/kubernetes/ssl/server.pem
–key-file=/opt/kubernetes/ssl/server-key.pem
–peer-cert-file=/opt/kubernetes/ssl/server.pem
–peer-key-file=/opt/kubernetes/ssl/server-key.pem
–trusted-ca-file=/opt/kubernetes/ssl/ca.pem
–peer-trusted-ca-file=/opt/kubernetes/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
cd /root/software
cp ssl/serverpem ssl/ca.pem /opt/kubernetes/ssl/
systemctl start etcd
systemctl enable etcd
ps -ef | grep etcd
在 k8s-node1、 k8s-node2 主机上部署 Etcd 节点
rsync -avcz /opt/kubernetes/* 192.168.107.202:/opt/kubernetes/
vim /opt/kubernetes/cfg/etcd
rsync -avcz /opt/kubernetes/* 192.168.107.203:/opt/kubernetes/
vim /opt/kubernetes/cfg/etcd
scp /usr/lib/systemd/system/etcd.service 192.168.107.202:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service 192.168.107.203:/usr/lib/systemd/system/
systemctl start etcd
systemctl enable etcd
echo “export PATH=$PATH:/opt/kubernetes/bin” >> /etc/profile
source /etc/profile
查看Etcd集群部署状况
cd /root/software/ssl/
etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints=“https://192.168.107.201:2379,https://192.168.107.202:2379,https://192.168.107.203:2379” cluster-health
部署Flannel网络
解压Flanneld
tar zxf flannel-v0.12.0-linux-amd64.tar.gz
复制到其他节点
cp flanneld mk-docker-opts.sh /opt/kubernetes/bin
scp flanneld mk-docker-opts.sh 192.168.107.202:/opt/kubernetes/bin
scp flanneld mk-docker-opts.sh 192.168.107.203:/opt/kubernetes/bin
设置flanneld配置文件
vim /opt/kubernetes/cfg/flanneld
FLANNEL_OPTIONS=“–etcd-endpoints=https://192.168.107.201:2379,https://192.168.107.202:2379,https://192.168.107.203:2379 -etcd-cafile=/opt/kubernetes/ssl/ca.pem -etcd-certfile=/opt/kubernetes/ssl/server.pem -etcd-keyfile=/opt/kubernetes/ssl/server-key.pem”
设置服务启动文件
cat [Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/opt/kubernetes/cfg/flanneld
ExecStart=/opt/kubernetes/bin/flanneld --ip-masq $FLANNEL_OPTIONS
ExecStartPost=/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
设置Docker启动文件
vim /usr/lib/systemd/system/docker.service
EnvironmentFile=/run/flannel/subnet.env
//新添加[Service]块内, 目的是让 Docker 网桥分发的 ip 地址与 flanned 网桥在同一个网段
ExecStart=/usr/bin/dockerd D O C K E R N E T W O R K O P T I O N S / / 添加 DOCKER_NETWORK_OPTIONS //添加 DOCKERNETWORKOPTIONS//添加 DOCKER_NETWORK_OPTIONS 变量, 替换原来的 ExecStart, 目的是调用 Flannel 网桥 IP地址
scp /opt/kubernetes/cfg/flanneld [email protected]:/opt/kubernetes/cfg/flanneld
scp /opt/kubernetes/cfg/flanneld [email protected]:/opt/kubernetes/cfg/flanneld
scp /usr/lib/systemd/system/flanneld.service [email protected]:/usr/lib/systemd/system/flanneld.service
scp /usr/lib/systemd/system/flanneld.service [email protected]:/usr/lib/systemd/system/flanneld.service
scp /usr/lib/systemd/system/docker.service [email protected]:/usr/lib/systemd/system/docker.service
scp /usr/lib/systemd/system/docker.service [email protected]:/usr/lib/systemd/system/docker.service
三台服务器修改好后,在其中master运行即可
分配子网段到ETCD
cd /root/software/ssl/
etcdctl -ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints=“https://192.168.107.201:2379,https://192.168.107.202:2379,https://192.168.107.203:2379” set /coreos.com/network/config ‘{“Network”:“172.17.0.0/16”,“Backend”:{“Type”:“vxlan”} }’
systemctl start flanneld
systemctl enable flanneld
systemctl daemon-reload
systemctl restart docker
部署Kubernetes-master组件
添加kubectl命令环境
tar zxf kubernetes-server-linux-amd64.tar.gz
cd 解压目录下/kubernetes/server/bin
cp kubectl /opt/kubernetes/bin/
创建TLS Bootstrapping Token
cd /opt/kubernetes/
export BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ’ ')
cat > token.csv <
–kubeconfig=bootstrap.kubeconfig
设置客户端认证参数
kubectl config set-credentials kubelet-bootstrap --token= B O O T S T R A P T O K E N − − k u b e c o n f i g = b o o t s t r a p . k u b e c o n f i g 设置上下文参数 k u b e c t l c o n f i g s e t − c o n t e x t d e f a u l t − − c l u s t e r = k u b e r n e t e s − − u s e r = k u b e l e t − b o o t s t r a p − − k u b e c o n f i g = b o o t s t r a p . k u b e c o n f i g 设置默认上下文 k u b e c t l c o n f i g u s e − c o n t e x t d e f a u l t − − k u b e c o n f i g = b o o t s t r a p . k u b e c o n f i g 创建 k u b y − p r o x y k u b e c o n f i g k u b e c t l c o n f i g s e t − c l u s t e r k u b e r n e t e s − − c e r t i f i c a t e − a u t h o r i t y = . / c a . p e m − − e m b e d − c e r t s = t r u e − − s e r v e r = {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 创建 kuby-proxy kubeconfig kubectl config set-cluster kubernetes --certificate-authority=./ca.pem --embed-certs=true --server= BOOTSTRAPTOKEN−−kubeconfig=bootstrap.kubeconfig设置上下文参数kubectlconfigset−contextdefault−−cluster=kubernetes−−user=kubelet−bootstrap−−kubeconfig=bootstrap.kubeconfig设置默认上下文kubectlconfiguse−contextdefault−−kubeconfig=bootstrap.kubeconfig创建kuby−proxykubeconfigkubectlconfigset−clusterkubernetes−−certificate−authority=./ca.pem−−embed−certs=true−−server={KUBE_APISERVER} --kubeconfig=kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy --client-certificate=./kube-proxy.pem --client-key=./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
设置Kube-apiserver
cd 解压目录/kubernetes/server/bin
cp kube-controller-manager kube-scheduler kube-apiserver /opt/kubernetes/bin/
cp /opt/kubernetes/token.csv /opt/kubernetes/cfg/
cd /opt/kubernetes/bin
上传master.zip
unzip master.zip
chmod +x *.sh
./apiserver.sh 192.168.107.201 https://192.168.107.201:2379,https://192.168.107.202:2379,https://192.168.107.203:2379
部署Kube-controller-manager
sh controller-manager.sh 127.0.0.1
部署kube-scheduler
sh scheduler.sh 127.0.0.1
检测组件运行是否正常
kubectl get cs
部署Kubernetes-node组件
在master上执行
cd /root/software/ssl/
scp *kubeconfig 192.168.107.202:/opt/kubernetes/cfg/
scp *kubeconfig 192.168.107.203:/opt/kubernetes/cfg/
cd 解压目录/kubernetes/server/bin
scp kubelet kube-proxy 192.168.107.202:/opt/kubernetes/bin
scp kubelet kube-proxy 192.168.107.203:/opt/kubernetes/bin
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
kubectl describe clusterrolebinding
在node上执行
cd /opt/kubernetes/bin
上传node.zip
unzip node.zip
chmod +x *.sh
sh kubelet.sh 192.168.107.202 192.168.107.20
sh proxy.sh 192.168.107.202
验证:
ps -ef | grep kube
在另一个节点同样执行
cd /opt/kubernetes/bin
上传node.zip
unzip node.zip
chmod +x *.sh
sh kubelet.sh 192.168.107.203 192.168.107.20
sh proxy.sh 192.168.107.203
验证:
ps -ef | grep kube
查看自动签发证书,并允许加入集群
kubectl get csr
kubectl certificate approve node-csr-BU_2qfoTCf-wFBbat7moeiPTov0ynWYWA5L47y-LDoA
kubectl certificate approve node-csr-WRREeKeC_obWiz1mu4lxRWhfYQOiHDUb5Npc_vzRKqo
kubectl get nodes
额外:
kubctl api-versions
kubectl api-resources | grep deployment