K8S集群搭建

  • Post author:
  • Post category:其他



集群规划:

首先要设置服务器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



版权声明:本文为wdh253753547原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。