系统环境说明

  • 使用操作系统: Centos-7.9.2009
  • 操作系统内核版本: 4.4.248 (lt)
  • Docker容器版本: 18.09.9
  • Kubeadm 版本: 1.19.6
  • 节点说明:
    • master01: 192.168.8.70 ,192.168.88.70
    • node01: 192.168.8.71 ,192.168.88.71
    • (备注: 为每个节点配置了两个ip,对外服务网段为: 192.168.8.0/24, 集群内部通讯: 192.168.88.0/24)

OS 准备

系统初始化

确保已将selinux关闭

参考文档

关闭swap

kubernetes 不支持 使用交换空间

1
2
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab

加载ivps模块

这里加载模块其目的是为了让后面的KubeProxy组件使用ivps模式来提高集群性能,kube-proxy它的作用是转发服务之间的流量(通过群集IP和节点端口)负载均衡到正确的后端Pod。Kube-proxy可以选择在三种模式中的之一运行,每种模式都使用不同的技术实现,它们分别是:userspaceiptablesIPVS,kubeadm 默认使用模式为iptables, 详细文档请 参考

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules \
&& bash /etc/sysconfig/modules/ipvs.modules \
&& lsmod | grep -e ip_vs -e nf_conntrack_ipv4

# 配置完成之后最好重启一下系统再检查是否有生效
reboot 
lsmod | grep -e ip_vs -e nf_conntrack_ipv4 # 重启完成后执行

修改主机名称

1
hostnamectl set-hostname xxx  # xxx为你要修改的主机名称 示例: hostnamectl set-hostname master01

配置修改hosts文件

1
2
3
4
5
6
7
8
# 每个节点多需要执行一下

cat >> /etc/hosts << EOF
192.168.88.70 master01
192.168.88.71 node01
EOF

# 我这里将域名解析至内部通讯ip,更具自身环境修改即可

配置节点之间免密登录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
ssh-keygen # 执行此命令后一路回车即可

# 将生成的公钥copy至目标主机完成免密
ssh-copy-id node01  
ssh-copy-id master01

# 如有多个节点时可使用此方法
for n in `seq -w 01 04`;do ssh-copy-id node$n;done
for n in `seq -w 01 03`;do ssh-copy-id master$n;done

# 非交互式完成免密 (依赖使用sshpass工具,可使用yum安装)
for i in `seq 1 3`;do sshpass -p '123456' ssh-copy-id -o StrictHostKeyChecking=no node"$i".com;done
for i in `seq 1 3`;do sshpass -p '123456' ssh-copy-id -o StrictHostKeyChecking=no master"$i".com;done

配置时间同步

1
2
3
4
5
6
7
8
yum install -y ntp # 客户端形式使用
/sbin/ntpdate -u ntp1.aliyun.com  # 这里使用aliyun的ntp服务器,如有内网ntp替换使用即可

# 添加至定时任务中
crontab -e  # 将下面的命令添加至定时任务队列中
*/10 * * * * /sbin/ntpdate -u ntp1.aliyun.com >/dev/null 2>&1

systemctl enable crond # 检查定时服务是否自启

kubeadm 安装部署集群

配置aliyun的kubernetes源

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
cat <<EOF > /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
EOF

yum makecache fast  # 执行后确认密钥,输入“y”

执行安装特点版本

1
2
3
4
5
6
yum list kubeadm --showduplicates | sort -r # 打印查看所有 kubeadm 版本

yum install -y kubeadm-1.19.6 kubelet-1.19.6 kubectl-1.19.6

systemctl enable kubelet  # 安装完成后 添加kebelet服务自启

配置 kubectl 命令补全

1
2
3
4
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

生成配置文件部署(master

1
2
3
4
mkdir workspace \
&& cd workspace 

kubeadm config print init-defaults >> kubeadm-init.yaml

修改后的配置文件展示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.88.70 # master ip
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io # 拉取镜像的地址,可设置为aliyun的地址"registry.cn-hangzhou.aliyuncs.com/google_containers",我这里使用默认。
kind: ClusterConfiguration
kubernetesVersion: v1.19.6
networking:
  dnsDomain: cluster.local
  podSubnet: 172.20.0.0/16  # 默认网段为: "10.244.0.0/16"
  serviceSubnet: 10.96.0.0/12
scheduler: {}

---
apiVersion: kubeproxy.config.k8s.io/v1alpha1  # 开启 ipvs 
kind: KubeProxyConfiguration
mode: "ipvs"

根据配置文件预拉取镜像 (master)

1
2
cd workspace \
&& kubeadm config images pull --config kubeadm-init.yaml

集群初始化 (master)

1
2
3
4
5
6
kubeadm init --config kubeadm-init.yaml

# 等待初始化完成后 配置kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

清理节点

如果在集群安装过程中,遇到一些不可描述的问题,我们可以使用下面的命令进行重置节点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
kubeadm reset
ifconfig cni0 down && ip link delete cni0
ifconfig flannel.1 down && ip link delete flannel.1
rm -rf /var/lib/cni/

# 清理Iptables表
## 注意:如果节点Iptables有特殊配置,以下命令请谨慎操作
sudo iptables --flush
sudo iptables --flush --table nat
sudo iptables --flush --table filter
sudo iptables --table nat --delete-chain
sudo iptables --table filter --delete-chain
systemctl restart docker

配置node加入集群 (node)

image-20201221154559403

Copy master 初始化后打印的语句,在node节点中执行

1
2
kubeadm join 192.168.88.70:6443 --token abcdef.0123456789abcdef  \
--discovery-token-ca-cert-hash sha256:e390239dde11e9657a2418f309728c422da1823ab6eba1ec2e433c3783eba46

image-20201221154949889

部署网络插件 flannel (master)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# Kubernetes v1.17+ 集群执行执行上面这条语句即可,但是由于我修改了podSubnet的默认地址,所有部署文件也需要相应的修改一下,就要执行第二条语句来将网段替换一下了。
kubectl apply -f  https://raw.githubusercontent.com/coreos/flannel/v0.13.0/Documentation/kube-flannel.yml

curl https://raw.githubusercontent.com/coreos/flannel/v0.13.0/Documentation/kube-flannel.yml|sed 's#10.244.0.0/16#172.20.0.0/16#g' | kubectl apply -f -

kubectl get pod -n kube-system  # 检查pod是否启动
NAME                               READY   STATUS    RESTARTS   AGE
coredns-f9fd979d6-45wgz            1/1     Running   0          15m
coredns-f9fd979d6-vphjf            1/1     Running   0          15m
etcd-master01                      1/1     Running   0          15m
kube-apiserver-master01            1/1     Running   0          15m
kube-controller-manager-master01   1/1     Running   0          15m
kube-flannel-ds-fxl9g              1/1     Running   0          2m8s
kube-flannel-ds-gqh5s              1/1     Running   0          2m8s
kube-proxy-bqhn4                   1/1     Running   0          15m
kube-proxy-pp2jd                   1/1     Running   0          10m
kube-scheduler-master01            1/1     Running   0          15m

kubelet 添加额外参数

不需要执行的操作,且做记录使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
service kubelet status # 查看服务信息
Drop-In: /usr/lib/systemd/system/kubelet.service.d  #找到关键行

# 进入此目录
/usr/lib/systemd/system/kubelet.service.d

# 查看这个配置文件中的内容
cat 10-kubeadm.conf
EnvironmentFile=-/etc/sysconfig/kubelet  # 修改这个配置文件中内容即可

# 修改节点的内网通讯IP
PRIVATE_IP=192.168.8.71
echo "KUBELET_EXTRA_ARGS=--node-ip=$PRIVATE_IP" > /etc/sysconfig/kubelet
systemctl daemon-reload
systemctl restart kubelet

部署dashboard

目前市面上Dashboard种类繁多,如:原生的 dashboardrancherlenskubespapeKuboard等等,因为项目缘故对rancher用的比较多,我们这里就演示部署rancher进行管理集群吧。

rancher 单机部署

1
2
3
4
5
6
7
docker run -d --restart=unless-stopped \
  --name rancher \
  -p 8080:80 -p 8443:443 \
  --privileged \
  rancher/rancher:v2.4.8

docker logs -f --tail 100 rancher # 查看日志等待启动完成

rancher 导入集群

添加集群

image-20201221163010517

image-20201221163052668

image-20201221163143449

复制命令在kubeadm 管理节点中执行

image-20201221163213606

发现执行下面语句后,ranche r集群显示异常。

1
curl --insecure -sfL https://192.168.8.66:8443/v3/import/jzrpkrzjpjgv9q5gqqg8hlhm29ldb5gv9mn4xpg8cxgfh5zg4mfs4h.yaml|sed 's#rbac.authorization.k8s.io/v1beta1#rbac.authorization.k8s.io/v1#g' |kubectl apply -f -

image-20201221164538840

部署 原生 dashboard

参考文档

1
2
3
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.1/aio/deploy/recommended.yaml

watch kubectl get pod -n kubernetes-dashboard  # 等待容器启动完成

临时使用kubectl 将 dashboard 代理出来

后面我会更新使用ingress 的方法

1
kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 8080:443 --addss 0.0.0.0

获取用户 Token

1
kubectl get secret -n kubernetes-dashboard|grep dashboard-token|awk '{print $1}'|xargs -I {} kubectl -n kubernetes-dashboard get secret {} -o jsonpath={.data.token}|base64 -d

访问地址为 https://<kubectl-ip>:8080, 注意如果chrome浏览器访问不安全的https链接没有继续访问的操作的话,可以尝试使用其他浏览器如: firefox,当然好像也可以降低chrome浏览器的安全级别来解决此问题

image-20201221201443582

登录成功后发现抛出大量权限不足错误 image-20201221195812459

解决方法-重新绑定默认用户为管理员(生产不推荐)

创建 admin-role.yaml 配置文件内容如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard
1
2
kubectl delete -f ./admin-role.yaml \
&& kubectl create -f ./admin-role.yaml

再次刷新不再报错了,且集群信息显示正常

image-20201221200401649