今日天气
  1. 博客/

Kubeadm 部署 kubernetes-v1.19.x 集群

·2153 字·5 分钟· ·
k8s kubeadm v1.19.x install
Johny
作者
Johny
熟练的 云原生搬砖师
Table of Contents

系统环境说明
#

  • 使用操作系统: 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 不支持 使用交换空间

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

加载ivps模块
#

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

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 # 重启完成后执行

修改主机名称
#

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

配置修改hosts文件
#

# 每个节点多需要执行一下

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

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

配置节点之间免密登录
#

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

配置时间同步
#

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源
#

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”

执行安装特点版本
#

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 命令补全
#

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

生成配置文件部署(master
#

mkdir workspace \
&& cd workspace 

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

修改后的配置文件展示
#

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)
#

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

集群初始化 (master)
#

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

清理节点
#

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

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节点中执行

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

image-20201221154949889

部署网络插件 flannel (master)
#

# 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 添加额外参数
#

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

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 单机部署
#

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集群显示异常。

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
#

参考文档

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 的方法

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

获取用户 Token
#

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 配置文件内容如下

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
kubectl delete -f ./admin-role.yaml \
&& kubectl create -f ./admin-role.yaml

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

image-20201221200401649

相关文章

kubernetes 集群中 控制平面 组件频繁发生重启的问题排查记录
·688 字·2 分钟·
k8s coredns flannel fix
Kind 部署本地k8s集群的使用记录
·326 字·1 分钟·
k8s docker devops centos7 kind
Centos7 安装之后必要的初始化操作
·1349 字·3 分钟·
linux centos centos7 docker linux
部署 Devops 必备利器 OpenLdap
·953 字·2 分钟·
devops openldap centos7
Docker Quickstart Redis Server
·174 字·1 分钟·
docker redis centos7
Docker 部署多网口 openWrt 软路由
·810 字·2 分钟·
openwrt linux centos7