如果首先机器如下
k8sm1 172.25.116.104
k8ss1 172.25.116.99
k8ss2 172.25.116.101
以下指令非特殊说明则需要在所有节点上执行
一、 CentOS设置
- 更换阿里源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repoyum makecache
- 安装网络工具
yum install net-tools -y
- 使用阿里NTP服务
yum install chrony -ysed -i "/server/d" /etc/chrony.confvi /etc/chrony.conf增加 server ntp.aliyun.com iburstsystemctl restart chronydchronyc tracking
- 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
- 修改Host
vi /etc/hosts
172.25.116.104 k8sm1
172.25.116.99 k8ss1
172.25.116.101 k8ss2
- 禁用SELINUX
setenforce 0
vi /etc/selinux/config 修改为如下
SELINUX=disabled
- 修改系统参数
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
- 使系统参数生效
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
- 开启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
- 安装IPVS工具
yum install ipset ipvsadm -y
二、 安装Docker
- 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
- 启动并设置开机
sudo systemctl start docker
sudo systemctl enable docker
- 修改配置
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
- 设置下载仓库
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*
- 安装软件
yum makecache
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
- 测试安装
kubelet –help
- 关闭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
- 配置kubelet所需的cgroup
sudo journalctl -f -u kubelet #可以查询日志
vi /etc/sysconfig/kubelet 在其中的参数后面追加如下内容
--cgroup-driver=systemd
- 启动服务
systemctl enable kubelet.service
systemctl daemon-reload
systemctl restart kubelet
- 编写初始化脚本(仅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命令
- 下载需要的镜像(仅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仓库下载。
- 重新打标签(仅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
- 控制节点初始化(仅在master运行,同时请记录最后出现的节点添加指令)
kubeadm init --config kubeadm.yaml
- 查看组件运行状态(仅在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
- 组件状态不正确使用如下方式修复
kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/
- 安装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
- 查看Pod运行状态(仅在master运行)
kubectl get pod -n kube-system
- 测试集群DNS是否可用(仅在master运行)
kubectl run curl --image=radial/busyboxplus:curl -it
nslookup kubernetes.default
- 添加节点(必须执行以上非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/^.* //'
- 移除节点(master)
kubectl drain node2 --delete-local-data --force --ignore-daemonsets
kubectl delete node node2
- 移除节点(非master)
kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/
- 移除节点(master)
kubectl delete node node2
- kube-proxy开启ipvs(master)
kubectl edit cm kube-proxy -n kube-system 进入配置文件找到config.conf对应章节修改
mode: “ipvs”
- 重启Kube-proxy pod(master)
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
- 查询kube-proxy pod状态(master)
kubectl get pod -n kube-system | grep kube-proxy
四、 安装Dashboard
- 下载yaml
mkdir /home/yaml
cd /home/yaml
curl -O https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
- 设置访问地址
sed -i '/targetPort:/a\ \ \ \ \ \ nodePort: 30010\n\ \ type: NodePort' recommended.yaml
- 下载镜像(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内容
- 创建服务
kubectl create -f recommended.yaml
- 查询服务
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
- 创建权限并获取令牌
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
- 下载yaml
cd /home/yaml
curl -O https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.46.0/deploy/static/provider/baremetal/deploy.yaml
- 设置边缘节点
kubectl label node k8ss5 node-role.kubernetes.io/edge=
- 修改部署节点
vi deploy.yaml在kind为deployment的containers节上增加如下内容
nodeSelector:
node-role.kubernetes.io/edge: “”
- 下载镜像
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中直接修改依赖的容器地址。
- 部署安装
为了能够监听本地80与443,要求在type:NodePort中在各协议下通过nodePort固定对应主机的端口
kubectl apply -f deploy.yaml
- 修改默认端口
vi /etc/kubernetes/manifests/kube-apiserver.yaml 增加如下内容
- --service-node-port-range=1-65535
重启主节点
- 验证安装
kubectl get pods --all-namespaces -l app.kubernetes.io/name=ingress-nginx --watch
六、使用Ingress公开Dashboard服务
- 生成证书
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
- 导入证书
kubectl create secret tls jinhx-secret --cert=jinhx.crt --key=jinhx.key
- 创建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
- 发布服务
kubectl apply -f ingress-dashboard.yaml
七、 安装Kuboard面板
- 下载文件
cd /home/yaml
curl -O https://kuboard.cn/install-script/kuboard.yaml
- 修改Ingress
vi kuboard.yaml 查找到ingress修改其中的域名
kubectl apply -f kuboard.yaml
- 获取访问Token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}')
