如果首先机器如下

k8sm1 172.25.116.104
k8ss1 172.25.116.99
k8ss2 172.25.116.101

以下指令非特殊说明则需要在所有节点上执行

一、 CentOS设置

  1. 更换阿里源
  1. curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  2. yum makecache
  1. 安装网络工具
  1. yum install net-tools -y
  1. 使用阿里NTP服务
  1. yum install chrony -y
  2. sed -i "/server/d" /etc/chrony.conf
  3. vi /etc/chrony.conf增加 server ntp.aliyun.com iburst
  4. systemctl restart chronyd
  5. chronyc tracking
  1. 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
  1. 修改Host
vi /etc/hosts

172.25.116.104 k8sm1
172.25.116.99 k8ss1
172.25.116.101 k8ss2
  1. 禁用SELINUX
setenforce 0

vi /etc/selinux/config 修改为如下

SELINUX=disabled
  1. 修改系统参数
vi /etc/sysctl.d/k8s.conf 输入以下内容

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
  1. 使系统参数生效
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
  1. 开启IPVS
vi /etc/sysconfig/modules/ipvs.modules 输入如下内容

#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
  1. 安装IPVS工具
yum install ipset ipvsadm -y

二、 安装Docker

  1. 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 设置仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
  1. 启动并设置开机
sudo systemctl start docker
sudo systemctl enable docker
  1. 修改配置
vi /etc/docker/daemon.json 输入如下内容

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

mkdir -p /etc/systemd/system/docker.service.d
systemctl daemon-reload
systemctl restart docker

三、 安装Kubeadm

  1. 设置下载仓库
vi /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
exclude=kube*
  1. 安装软件
yum makecache
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
  1. 测试安装
kubelet –help
  1. 关闭swap
swapoff -a

vi /etc/fstab 注释掉SWAP使用 free -m确认

vi /etc/sysctl.d/k8s.conf 增加如下参数

vm.swappiness=0

执行如下指令

sysctl -p /etc/sysctl.d/k8s.conf
  1. 配置kubelet所需的cgroup
sudo journalctl -f -u kubelet  #可以查询日志

vi /etc/sysconfig/kubelet 在其中的参数后面追加如下内容

--cgroup-driver=systemd
  1. 启动服务
systemctl enable kubelet.service
systemctl daemon-reload
systemctl restart kubelet
  1. 编写初始化脚本(仅master运行,切记advertiseAddress必须修改为主机IP)
vi kubeadm.yaml 输入如下内容

apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 172.18.58.70 #此处IP地址必须修改
  bindPort: 6443
nodeRegistration:
  taints:
  - effect: PreferNoSchedule
    key: node-role.kubernetes.io/master
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.21.0
networking:
  podSubnet: 10.244.0.0/16

如果需要查看默认的配置信息可以通过kubeadm config print init-defaults命令

  1. 下载需要的镜像(仅master运行)
docker pull harbor.domain.cn/gcr/kube-apiserver:v1.21.3
docker pull harbor.domain.cn/gcr/kube-controller-manager:v1.21.3
docker pull harbor.domain.cn/gcr/kube-scheduler:v1.21.3
docker pull harbor.domain.cn/gcr/kube-proxy:v1.21.3
docker pull harbor.domain.cn/gcr/pause:3.4.1
docker pull harbor.domain.cn/gcr/etcd:3.4.13-0
docker pull harbor.domain.cn/gcr/coredns:v1.8.0
docker pull harbor.domain.cn/gcr/flannel:v0.14.0

以上均从官方镜像下载好后缓存在本地镜像仓库中,如果用户需要下载可从registry.aliyuncs.com/google_containers仓库下载。

  1. 重新打标签(仅master运行)
docker tag harbor.domain.cn/gcr/kube-apiserver:v1.21.3 k8s.gcr.io/kube-apiserver:v1.21.3
docker tag harbor.domain.cn/gcr/kube-controller-manager:v1.21.3 k8s.gcr.io/kube-controller-manager:v1.21.3
docker tag harbor.domain.cn/gcr/kube-scheduler:v1.21.3 k8s.gcr.io/kube-scheduler:v1.21.3
docker tag harbor.domain.cn/gcr/kube-proxy:v1.21.3 k8s.gcr.io/kube-proxy:v1.21.3
docker tag harbor.domain.cn/gcr/pause:3.4.1 k8s.gcr.io/pause:3.4.1
docker tag harbor.domain.cn/gcr/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
docker tag harbor.domain.cn/gcr/coredns:v1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0
docker tag harbor.domain.cn/gcr/flannel:v0.14.0 quay.io/coreos/flannel:v0.14.0
  1. 控制节点初始化(仅在master运行,同时请记录最后出现的节点添加指令)
kubeadm init --config kubeadm.yaml
  1. 查看组件运行状态(仅在master运行)
mkdir -p /root/.kube
cp /etc/kubernetes/admin.conf /root/.kube/config
kubectl get nodes
kubectl get cs

如果出现scheduler与controller处在不健康状态则可以通过如下指令修复,删除其中port=0这部分内容

vi /etc/kubernetes/manifests/kube-controller-manager.yaml
vi /etc/kubernetes/manifests/kube-scheduler.yaml
  1. 组件状态不正确使用如下方式修复
kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/
  1. 安装flannel网络(仅在master运行)

由于国内特殊情况需要在/etc/hosts中增加如下内容

199.232.68.133 raw.githubusercontent.com

接着执行如下内容

mkdir -p ~/k8s/
cd ~/k8s
curl -O https://raw.githubusercontent.com/coreos/flannel/v0.14.0/Documentation/kube-flannel.yml

kubectl apply -f  kube-flannel.yml
  1. 查看Pod运行状态(仅在master运行)
kubectl get pod -n kube-system
  1. 测试集群DNS是否可用(仅在master运行)
kubectl run curl --image=radial/busyboxplus:curl -it

nslookup kubernetes.default
  1. 添加节点(必须执行以上非master执行的指令)
首先需要下载需要的镜像  

docker pull harbor.domain.cn/gcr/kube-proxy:v1.21.0
docker pull harbor.domain.cn/gcr/pause:3.4.1
docker pull harbor.domain.cn/gcr/flannel:v0.14.0

docker tag harbor.domain.cn/gcr/kube-proxy:v1.21.0 k8s.gcr.io/kube-proxy:v1.21.0
docker tag harbor.domain.cn/gcr/pause:3.4.1 k8s.gcr.io/pause:3.4.1
docker tag harbor.domain.cn/gcr/flannel:v0.14.0 quay.io/coreos/flannel:v0.14.0

kubeadm join 172.25.116.104:6443 –token xxxxx #请参考master输出的指令
kubectl get node

由于添加节点令牌存在时限,所以建议先通过kubeadm token list查询,如果不存在则通过如下指令重新生成。

kubeadm token create

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
  1. 移除节点(master)
kubectl drain node2 --delete-local-data --force --ignore-daemonsets
kubectl delete node node2
  1. 移除节点(非master)
kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/
  1. 移除节点(master)
kubectl delete node node2
  1. kube-proxy开启ipvs(master)
kubectl edit cm kube-proxy -n kube-system  进入配置文件找到config.conf对应章节修改

mode: “ipvs”
  1. 重启Kube-proxy pod(master)
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
  1. 查询kube-proxy pod状态(master)
kubectl get pod -n kube-system | grep kube-proxy

四、 安装Dashboard

  1. 下载yaml
mkdir /home/yaml
cd /home/yaml

curl -O https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
  1. 设置访问地址
sed -i '/targetPort:/a\ \ \ \ \ \ nodePort: 30010\n\ \ type: NodePort' recommended.yaml
  1. 下载镜像(kubernetesui/dashboard:v2.3.1)
docker pull harbor.domain.cn/gcr/dashboard:v2.3.1

docker tag harbor.domain.cn/gcr/dashboard:v2.3.1 kubernetesui/dashboard:v2.3.1

为了保障服务能够使用对应端口需要修改服务可用的端口范围

vi /etc/kubernetes/manifests/kube-apiserver.yaml

修改其中的service-node-port-range内容
  1. 创建服务
kubectl create -f recommended.yaml
  1. 查询服务
kubectl get deployment kubernetes-dashboard -n kubernetes-dashboard

kubectl get pods -n kubernetes-dashboard -o wide

kubectl get services -n kubernetes-dashboard

netstat -ntlp|grep 30010
  1. 创建权限并获取令牌
kubectl create serviceaccount  dashboard-admin -n kubernetes-dashboard
kubectl create clusterrolebinding  dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin

kubectl describe secrets -n kubernetes-dashboard $(kubectl -n kubernetes-dashboard get secret | awk '/dashboard-admin/{print $1}')

五、 安装Ingress

  1. 下载yaml
cd /home/yaml

curl -O https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.46.0/deploy/static/provider/baremetal/deploy.yaml
  1. 设置边缘节点
kubectl label node k8ss5 node-role.kubernetes.io/edge=
  1. 修改部署节点
vi deploy.yaml在kind为deployment的containers节上增加如下内容

nodeSelector:
  node-role.kubernetes.io/edge: “”
  1. 下载镜像
docker pull harbor.domain.cn/gcr/nginx-ingress-controller:v0.46.0

docker tag harbor.domain.cn/gcr/nginx-ingress-controller:v0.46.0 k8s.gcr.io/ingress-nginx/controller:v0.46.0

如果以上方式无法满足,可以deploy.yaml中直接修改依赖的容器地址。

  1. 部署安装
为了能够监听本地80与443,要求在type:NodePort中在各协议下通过nodePort固定对应主机的端口

kubectl apply -f deploy.yaml
  1. 修改默认端口
vi /etc/kubernetes/manifests/kube-apiserver.yaml 增加如下内容

- --service-node-port-range=1-65535

重启主节点
  1. 验证安装
kubectl get pods --all-namespaces -l app.kubernetes.io/name=ingress-nginx --watch

六、使用Ingress公开Dashboard服务

  1. 生成证书
openssl genrsa -out jinhx.key 2048
openssl req -new -x509 -key jinhx.key -out jinhx.crt -subj /C=CN/ST=Shanghai/L=Shanghai/O=DevOps/CN=*.jinhx.cn
  1. 导入证书
kubectl create secret tls jinhx-secret --cert=jinhx.crt --key=jinhx.key
  1. 创建yaml
vi ingress-dashboard.yaml 输入以下内容

# ------------------ Dashboard Ingress ------------------- #

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  tls:
  - hosts:
    - k8s.jinhx.cn
    secretName: jinhx-secret
  rules:
  - host: k8s.jinhx.cn
    http:
      paths:
      - path: /
        backend:
          serviceName: kubernetes-dashboard
          servicePort: 443
  1. 发布服务
kubectl apply -f ingress-dashboard.yaml

七、 安装Kuboard面板

  1. 下载文件
cd /home/yaml

curl -O https://kuboard.cn/install-script/kuboard.yaml
  1. 修改Ingress
vi kuboard.yaml 查找到ingress修改其中的域名

kubectl apply -f kuboard.yaml
  1. 获取访问Token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}')