集群规划:
首先要设置服务器ip为静态ip,防止ip后边漂移。
ip |
主机名 |
节点 |
192.168.255.128 |
master |
master |
192.168.255.129 |
slave1 |
s1 |
192.168.255.130 |
slave2 |
s2 |
检测系统环境:
1.查看服务器操作系统版本
cat /etc/redhat-release
安装Docker和K8S集群的服务器操作系统版本需要在CentOS 7以上。
2.查看服务器主机名
hostname
注意:集群中服务器的主机名不能是localhost,我这边已改为master,slave1,slave2。
3.查看服务器的CPU核数
注意:集群中服务器的CPU核数不能少于2个。
系统设置
1.安装nfs-utils
yum install -y nfs-utils
yum install -y wget
2.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
3.关闭 SeLinux
setenforce 0
sed -i “s/SELINUX=enforcing/SELINUX=disabled/g” /etc/selinux/config
4.关闭 swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
5.修改 /etc/sysctl.conf
新建sys_config.sh脚本文件。
# 如果有配置,则修改
sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g" /etc/sysctl.conf
# 可能没有,追加
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
# 执行命令以应用
sysctl -p
执行sys_config.sh脚本文件。
chmod a+x ./sys_config.sh
./sys_config.sh
Docker安装
三台服务器上都需要安装Docker并配置阿里云镜像加速器。
1.安装docker
使用官方安装脚本自动安装 (仅适用于公网环境)
curl -fsSL
https://get.docker.com
| bash -s docker –mirror Aliyun
基本操作:
sudo systemctl start docker 启动
sudo systemctl stop docker 停止
sudo systemctl status docker 状态
sudo systemctl restart docker 重新启动
systemctl enable docker 开机自启动
2.配置镜像加速器(阿里云)
可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF
# xxx自行替换
sudo systemctl daemon-reload
sudo systemctl restart docker
K8S安装
分别在三台服务器上安装K8S。
1.配置K8S yum源
新建k8s_yum.sh脚本文件。
文件的内容如下所示。
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
执行k8s_yum.sh文件。
chmod a+x ./k8s_yum.sh
./k8s_yum.sh
2.卸载旧版本的K8S
yum remove -y kubelet kubeadm kubectl
3.安装kubelet、kubeadm、kubectl
yum install -y kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2
4.修改docker Cgroup Driver为systemd
sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service
5.重启 docker,并启动 kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet && systemctl start kubelet
初始化Master节点
1.初始化Master节点的网络环境
# 只在 master 节点执行
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export MASTER_IP=192.168.255.128
# 替换 k8s.master 为 您想要的 dnsName
export APISERVER_NAME=k8s.master
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=172.18.0.1/16
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
2.初始化Master节点
在master服务器上创建init_master.sh脚本文件,文件内容如下所示。
#!/bin/bash
# 脚本出错时终止执行
set -e
if [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; then
echo -e "\033[31;1m请确保您已经设置了环境变量 POD_SUBNET 和 APISERVER_NAME \033[0m"
echo 当前POD_SUBNET=$POD_SUBNET
echo 当前APISERVER_NAME=$APISERVER_NAME
exit 1
fi
# 查看完整配置选项 https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2
rm -f ./kubeadm-config.yaml
cat <<EOF > ./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.18.2
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
serviceSubnet: "10.96.0.0/16"
podSubnet: "${POD_SUBNET}"
dnsDomain: "cluster.local"
EOF
# kubeadm init
# 根据您服务器网速的情况,您需要等候 3 - 10 分钟
kubeadm init --config=kubeadm-config.yaml --upload-certs
# 配置 kubectl
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config
# 安装 calico 网络插件
# 参考文档 https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremises
echo "安装calico-3.13.1"
rm -f calico-3.13.1.yaml
wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
kubectl apply -f calico-3.13.1.yaml
执行init_master.sh脚本文件。
sh ./init_master.sh
3.查看Master节点的初始化结果
(1)确保所有容器组处于Running状态
# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide
如下所示。
(2) 查看 Master 节点初始化结果
kubectl get nodes -o wide
如下所示:
初始化Worker节点
1.获取join命令参数
在Master节点上执行如下命令获取join命令参数。
kubeadm token create –print-join-command
其中,有如下一行输出。
kubeadm join k8s.master:6443 –token aar92s.xuzvlscp3a1ok46h –discovery-token-ca-cert-hash sha256:9cd4836777456508a6e9c6d02a31b0ed346c57d823c7c2be108ed331836ace38
注意:join命令中的token的有效时间为 2 个小时,2小时内,可以使用此 token 初始化任意数量的 worker 节点。
2.初始化Worker节点
针对所有的 worker 节点执行,在这里,就是在slave1服务器和slave2服务器上执行。
创建init_worker.sh脚本文件,文件内容如下所示。
# 只在 worker 节点执行
# 192.168.255.128 为 master 节点的内网 IP
export MASTER_IP=192.168.255.128
# 替换 k8s.master 为初始化 master 节点时所使用的 APISERVER_NAME
export APISERVER_NAME=k8s.master
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
# 替换为 master 节点上 kubeadm token create 命令输出的join
kubeadm join k8s.master:6443 --token aar92s.xuzvlscp3a1ok46h --discovery-token-ca-cert-hash sha256:9cd4836777456508a6e9c6d02a31b0ed346c57d823c7c2be108ed331836ace38
其中,kubeadm join…就是master 节点上 kubeadm token create 命令输出的join。
赋予init_worker.sh脚本文件文件可执行权限,并执行init_worker.sh脚本文件。
chmod a+x ./init_worker.sh
./init_worker.sh
3.查看初始化结果
在Master节点执行如下命令查看初始化结果。
kubectl get nodes -o wide
如下:
安装dashboard
1.下载recommended.yaml文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
2.修改recommended.yaml文件
---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort #增加
ports:
- port: 443
targetPort: 8443
nodePort: 30000 #增加
selector:
k8s-app: kubernetes-dashboard
---
#因为自动生成的证书很多浏览器无法使用,所以我们自己创建,注释掉kubernetes-dashboard-certs对象声明
#apiVersion: v1
#kind: Secret
#metadata:
# labels:
# k8s-app: kubernetes-dashboard
# name: kubernetes-dashboard-certs
# namespace: kubernetes-dashboard
#type: Opaque
---
3.创建证书
mkdir dashboard-certs
cd dashboard-certs/
#创建命名空间
kubectl create namespace kubernetes-dashboard
# 创建key文件
openssl genrsa -out dashboard.key 2048
#证书请求
openssl req -days 36000 -new -out dashboard.csr -key dashboard.key -subj '/CN=dashboard-cert'
#自签证书
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
#创建kubernetes-dashboard-certs对象
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard
4.安装dashboard
kubectl create -f ~/recommended.yaml
5.查看安装结果
kubectl get service -n kubernetes-dashboard -o wide
6.创建dashboard管理员
vim dashboard-admin.yaml
文件的内容如下所示。
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: dashboard-admin
namespace: kubernetes-dashboard
执行脚本
kubectl create -f ./dashboard-admin.yaml
7.为用户分配权限
vim dashboard-admin-bind-cluster-role.yaml
文件内容如下所示。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dashboard-admin-bind-cluster-role
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kubernetes-dashboard
保存退出后执行如下命令为用户分配权限。
kubectl create -f ./dashboard-admin-bind-cluster-role.yaml
8.查看并复制用户Token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')
9.查看dashborad页面
https://192.168.255.128:30000/
这里,我们选择Token方式登录,并输入在命令行获取到的Token,进入后如下所示。
kubectl 命令补全
安装bash-completion:
# yum install -y bash-completion
# source /usr/share/bash-completion/bash_completion
应用kubectl的completion到系统环境中
# source <(kubectl completion bash)
# echo "source <(kubectl completion bash)" >> ~/.bashrc