一、部署Kubernetes
实验环境
服务器 | 主机名 | IP地址 | 主要组件 |
---|---|---|---|
k8s集群master01 + etcd01 | master01 | 192.168.10.100 | kube-apiserver kube-controller-manager kube-schedular etcd |
k8s集群node01 + etcd02 | node01 | 192.168.10.101 | kubelet kube-proxy docker flannel |
k8s集群node02 + etcd03 | node02 | 192.168.10.102 | kubelet kube-proxy docker flannel |
1.1、操作系统初始化配置
1.1.1 设置主机名
[root@localhost ~]#hostnamectl set-hostname master01
[root@localhost ~]#bash
[root@localhost ~]#hostnamectl set-hostname node01
[root@localhost ~]#bash
[root@localhost ~]#hostnamectl set-hostname node02
[root@localhost ~]#bash
1.1.2 关闭防火墙
#所有节点,关闭防火墙规则,
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
1.1.3 关闭核心防护
##所有节点关闭核心防护
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
1.1.4 关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
1.1.5 添加主机映射
cat >> /etc/hosts << EOF
192.168.10.100 master01
192.168.10.102 node01
192.168.10.103 node02
EOF
cat /etc/hosts
1.1.6 调整内核参数
cat > /etc/sysctl.d/k8s.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
sysctl --system
1.1.7 时间同步
##三台机器同时进行时间同步
yum install ntpdate -y
ntpdate time.windows.com
进行时间同步
1.2、所有 node 节点部署docker引擎
1.2.1 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
1.2.2 安装阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.2.3 安装docker
yum install -y docker-ce docker-ce-cli containerd.io
1.2.4 开启docker服务并设置开机自启、查看状态
systemctl start docker.service
systemctl enable docker.service
systemctl status docker.service
1.2.5 查看版本
docker -v
1.2.6 添加镜像加速器配置
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://5nbz4xnp.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
1.3、部署 etcd 集群
在master01节点上操作
1.3.1 准备cfssl证书生成工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl --no-check-certificate
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson --no-check-certificate
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo --no-check-certificate
chmod +x /usr/local/bin/cfssl*
给cfssl证书添加执行权限
chmod +x /usr/local/bin/cfssl*
1.3.2 生成Etcd证书
1.3.2.1 创建etcd证书目录
mkdir /opt/k8s
cd /opt/k8s/
1.3.2.2 上传etcd的两个脚本
etcd-cert.sh etcd.sh #这需要上传下面两个文件,上传之后需要在脚本里面修改一下IP地址
[root@master k8s]#vim etcd-cert.sh
将大概79行开始的hosts改为自己的ip,不修改的话生成的证书效果没用!!!
chmod +x etcd-cert.sh etcd.sh ##给两个脚本添加执行权限
1.3.2.3 创建用于生成CA证书、etcd 服务器证书以及私钥的目录
mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/
./etcd-cert.sh #生成CA证书、etcd 服务器证书以及私钥
ls
1.3.2.4 上传 etcd-v3.4.9-压缩包 到 /opt/k8s 目录中,启动etcd服务
[root@master01 etcd-cert]#cd /opt/k8s/
[root@master01 k8s]#ls
etcd-cert etcd.sh
[root@master01 k8s]#rz -E
rz waiting to receive.
[root@master01 k8s]#ls
etcd-cert etcd.sh etcd-v3.4.9-linux-amd64.tar.gz
[root@master01 k8s]#tar xf etcd-v3.4.9-linux-amd64.tar.gz
[root@master01 k8s]#ls
etcd-cert etcd.sh etcd-v3.4.9-linux-amd64 etcd-v3.4.9-linux-amd64.tar.gz
[root@master01 k8s]#ls etcd-v3.4.9-linux-amd64
Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
1.3.2.5 创建用于存放 etcd 配置文件,命令文件,证书的目录
mkdir -p /opt/etcd/{cfg,bin,ssl}
cd /opt/k8s/etcd-v3.4.9-linux-amd64/
mv etcd etcdctl /opt/etcd/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
cd /opt/k8s/
./etcd.sh etcd01 192.168.10.80 etcd02=https://192.168.10.18:2380,etcd03=https://192.168.10.19:2380
##进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动,如果只启动其中一台后,服务会卡在那里,直到集群中所有etcd节点都已启动,可忽略这个情况。
##在开一个窗口查看
ps -ef | grep etcd
1.3.2.6 把etcd相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点
scp -r /opt/etcd/ root@192.168.10.102:/opt/
scp -r /opt/etcd/ root@192.168.10.103:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.10.102:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.10.103:/usr/lib/systemd/system/
1.4、部署node节点的etcd集群
1.4.1 在 node01 节点上操作
#[Member]
ETCD_NAME="etcd02"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.10.102:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.10.102:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.10.102:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.10.102:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.10.100:2380,etcd02=https://192.168.10.102:2380,etcd03=https://192.168.10.103:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
1.4.2 启动etcd服务
systemctl start etcd.service #启动etcd服务
systemctl enable etcd.service #设置开机自启
systemctl status etcd #查看服务状态
1.4.3 在node02节点操作
#[Member]
ETCD_NAME="etcd03"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.10.103:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.10.103:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.10.103:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.10.103:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.10.100:2380,etcd02=https://192.168.10.102:2380,etcd03=https://192.168.10.103:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
1.4.4 启动etcd服务
systemctl start etcd.service #启动etcd服务
systemctl enable etcd.service #设置开机自启
systemctl status etcd #查看服务状态
再次查看master01节点上的etcd服务的状态
1.4.5 检查etcd群集状态
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.10.100:2379,https://192.168.10.102:2379,https://192.168.10.103:2379" endpoint health --write-out=table
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.10.100:2379,https://192.168.10.102:2379,https://192.168.10.103:2379" endpoint status --write-out=table
-------------------------------------------------------------------------------------------
--cert-file:识别HTTPS端使用SSL证书文件
--key-file:使用此SSL密钥文件标识HTTPS客户端
--ca-file:使用此CA证书验证启用https的服务器的证书
--endpoints:集群中以逗号分隔的机器地址列表
cluster-health:检查etcd集群的运行状况
1.4.6 查看etcd集群成员列表
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.10.100:2379,https://192.168.10.102:2379,https://192.168.10.103:2379" --write-out=table member list
---------------------------------------------------------------------------------------------cert-file:识别HTTPS端使用SSL证书文件
--key-file:使用此SSL密钥文件标识HTTPS客户端
--ca-file:使用此CA证书验证启用https的服务器的证书
--endpoints:集群中以逗号分隔的机器地址列表
member list 查看列表
1.5、部署Master 组件
master组件签发证书
在 master01 节点上操作
1.5.1 上传 master.zip 到 /opt/k8s 目录中,并解压
cd /opt/k8s/
master.zip k8s-cert.sh
unzip master.zip
chmod +x *.sh
1.5.2 创建kubernetes工作目录
mkdir -p /opt/kubernetes/{cfg,bin,ssl,logs}
tree /opt/kubernetes/
1.5.3 创建用于生成CA证书、相关组件的证书和私钥的目录
[root@master01 k8s]#mkdir /opt/k8s/k8s-cert
[root@master01 k8s]#mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
[root@master01 k8s]#cd /opt/k8s/k8s-cert/
[root@master01 k8s-cert]#ls
k8s-cert.sh
[root@master01 k8s-cert]#vim k8s-cert.sh
[root@master01 k8s-cert]#./k8s-cert.sh
pwd
ll *.pem
1.5.4 复制CA证书、apiserver相关证书和私钥到 kubernetes工作目录的 ssl 子目录中
cp ca*pem apiserver*pem /opt/kubernetes/ssl/
1.5.4.1 上传 kubernetes-server 到 /opt/k8s/ 目录中,解压 kubernetes 压缩包
下载地址:https://github.com/kubernetes/kubernetes/blob/release-1.20/CHANGELOG/CHANGELOG-1.20.md
#注:打开链接你会发现里面有很多包,下载一个server包就够了,包含了Master和Worker Node二进制文件。
[root@master01 k8s-cert]#cd /opt/k8s/
[root@master01 k8s]#rz -E
rz waiting to receive.
[root@master01 k8s]#ls
admin.sh etcd-cert etcd-v3.4.9-linux-amd64.tar.gz master.zip
apiserver.sh etcd.sh k8s-cert scheduler.sh
controller-manager.sh etcd-v3.4.9-linux-amd64 kubernetes-server-linux-amd64.tar.gz
[root@master01 k8s]#
[root@master01 k8s]#tar xf kubernetes-server-linux-amd64.tar.gz
[root@master01 k8s]#ls
admin.sh etcd-cert etcd-v3.4.9-linux-amd64.tar.gz kubernetes-server-linux-amd64.tar.gz
apiserver.sh etcd.sh k8s-cert master.zip
controller-manager.sh etcd-v3.4.9-linux-amd64 kubernetes scheduler.sh
1.5.4.2 复制master组件的关键命令文件到 kubernetes工作目录的 bin 子目录中
[root@master01 k8s]#cd /opt/k8s/kubernetes/server/bin
[root@master01 bin]#cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
[root@master01 bin]#ln -s /opt/kubernetes/bin/* /usr/local/bin/
1.5.4.3 创建 bootstrap token 认证文件,apiserver 启动时会调用,接下来就可以用 RBAC 给他授权
[root@master01 bin]#cd /opt/k8s/
[root@master01 k8s]#vim token.sh
#!/bin/bash
#获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格
BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
#生成 token.csv 文件,按照 Token序列号,用户名,UID,用户组 的格式生成
cat > /opt/kubernetes/cfg/token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
chmod +x token.sh
./token.sh
cat /opt/kubernetes/cfg/token.csv
1.5.5 二进制文件、token、证书都准备好后,开启 apiserver 服务
[root@master01 k8s]#cd /opt/k8s/
[root@master01 k8s]#./apiserver.sh 192.168.10.100 https://192.168.10.100:2379,https://192.168.10.102:2379,https://192.168.10.103:2379
#安全端口6443用于接收HTTPS请求,用于基于Token文件或客户端证书等认证
[root@master01 k8s]#ps aux | grep kube-apiserver
[root@master01 k8s]#netstat -natp | grep 6443
1.5.6 启动 scheduler 服务
cd /opt/k8s/
ls
vim scheduler.sh
vim scheduler.sh
#生成kubeconfig文件 ##45
KUBE_CONFIG="/opt/kubernetes/cfg/kube-scheduler.kubeconfig" ##46
KUBE_APISERVER="https://192.168.10.100:6443" ##47
[root@master01 k8s]#./scheduler.sh
[root@master01 k8s]#ps aux | grep kube-scheduler
1.5.7 启动 controller-manager 服务
pwd
/opt/k8s
ls
vim controller-manager.sh
#生成kubeconfig文件
KUBE_CONFIG="/opt/kubernetes/cfg/kube-controller-manager.kubeconfig"
KUBE_APISERVER="https://192.168.10.100:6443"
[root@master01 k8s]#./controller-manager.sh
[root@master01 k8s]#ps aux | grep kube-controller-manager
1.5.8 生成kubectl连接集群的kubeconfig文件
pwd
/opt/k8s
ls
vim admin.sh
[root@master01 k8s]#vim admin.sh
通过kubectl工具查看当前集群组件状态
[root@master01 k8s]#pwd
/opt/k8s
[root@master01 k8s]#kubectl get cs
1.5.9 查看版本信息
[root@master01 k8s]#kubectl version