k8s集群 手动部署
环境
- vmware虚拟机3台
- centos7.9 minimal
- docker 20.10.9
- k8s 1.24.3
主机名 | 规格 | IP |
---|---|---|
k8s-master | 2c-2g-40g | 192.168.36.100 |
k8s-node01 | 2c-2g-40g | 192.168.36.101 |
k8s-node02 | 2c-2g-40g | 192.168.36.102 |
步骤
常规配置
|
|
内核配置
|
|
添加k8s软件源
|
|
原文档在repo中添加repo_gpgcheck=1,实测无法验证key,遂将该配置去掉
配置免密登录
|
|
安装ipvs
|
|
安装docker
|
|
|
|
安装命令补全
|
|
镜像加速
-
登陆阿里云容器模块:https://cr.console.aliyun.com
-
按如下配置
验证docker
|
|
-
以下为正常输出
修改cgroup driver
|
|
k8s安装
|
|
-
kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
-
kubeadm 用于初始化集群,启动集群的命令工具
-
kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
kubectl命令补全
|
|
初始化master
|
|
初始化错误
-
kubeadm初始化错误,提示kubelet服务可能运行不正常,检查kubelet服务状态
-
kubelet运行错误,可能是因为k8s 1.24已删除dockershim,无法调用docker的原因,需要使用cri-dockerd
使用cri-dockerd:https://blog.csdn.net/wuxingge/article/details/125458691
所有节点都需要安装
- 装完cri-dockerd,重新初始化kubeadm
|
|
安装flannel网络
|
|
flannel pod出现问题
-
查看kube-flannel-ds-amd64日志
-
这里提示该pod所使用的serviceaccount用户没有调用api group的权限
引用有关serviceaccount的参考:
-
这里使用的授权插件是rbac,意思是通过角色控制权限。serviceaccount对象代表一个账号,如果要赋予这个帐号权限,我们还需要一个role对象和一个role与serviceaccount绑定的rolebinding对象,这些都是RBAC插件提供的资源对象。
-
观察到kube-flannel中有对这些对象的定义,看下执行时提示的问题:
-
这里提到ClusterRole和ClusterRoleBinding在v1beta1中找不到定义,所以这些配置没有生效
-
在yaml里找出这些配置的源码:
-
使用的api版本都是v1beta1,但是在v1.22+里已经不可用,需要更换成v1
警告参考: https://github.com/kelseyhightower/kubernetes-the-hard-way/issues/612
但是我这里安装flannel没有出现warning的提示
-
更换之后重新执行,再重启kube-flannel就可以了
将work节点加入集群
-
在master初始化结束时,会返回join所使用的token、discovery-token-ca-cert-hash等信息,如果没有记下来,需要通过以下方式获取:
1 2 3 4 5 6
# 在master节点执行 ## 获取token kubeadm token list ## 获取discovery-token-ca-cert-hash openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2> /dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
注意token 过期时间是24小时
certificate-key 过期时间是2小时
1 2 3 4 5
# 重新生成基础的join命令 kubeadm token create --print-join-command # 添加work节点用生成的命令即可,如果是添加master节点还需要生成certificate-key kubeadm init phase upload-certs --experimental-upload-certs # 添加master节点,使用生成的join命令和certificate-key拼接起来即可
1 2
# 在node01和node02上执行,注意和kubeadm init一样要指定cri-socket kubeadm join 192.168.36.100:6443 --token 89y41v.eotdhbpk2v0a1n7d --discovery-token-ca-cert-hash sha256:7ad6aecb98f99621297f27e883e3a51d3114cdec64cefeb5d087a96f0fda8804 --cri-socket=unix:///var/run/cri-dockerd.sock
安装dashboard
|
|
pod运行失败
-
查看pod运行状态
-
查看pod日志
- 修改recommanded.yaml
|
|
|
|
web访问问题
-
由于设置了NodePort,可以将端口暴露在节点IP上,就可以使用https://
: 来访问了 -
web访问显示
-
查看日志,发现是证书问题
-
最好的解决方法是使用自签证书
|
|
- 在主机上安装ca证书,之后访问
-
创建dashboard-admin用户的token
1
kubectl -n kubernetes-dashboard create token dashboard-admin
网上绝大部份资料,提到创建serviceaccount并绑定clusterrole之后,会自动生成一个secret给该sa,里面附带token,但实测没有。
有关内容见文章末尾。
- 或者可以手动创建一个secret绑定到dashborad-admin
|
|
可以先将dashboard-admin的配置导出成yaml,然后进行修改
kubectl get sa/dashboard-admin -o yaml -n kubernetes-dashboard > dashboardd-admin.yaml
v1.24开始默认不自动为sa生成secret
-
发现按照部署操作生成dashborad-admin这个sa,没有查找到对应的secret,正常来说都会通过tokencontroller来自动为其生成secret。
-
查找资料发现,从v1.24开始LegacyServiceAccountTokenNoAutoGeneration默认为enable,也就是默认不为任何sa自动生成secret
The
LegacyServiceAccountTokenNoAutoGeneration
feature gate is beta, and enabled by default. When enabled, Secret API objects containing service account tokens are no longer auto-generated for every ServiceAccount. Use the TokenRequest API to acquire service account tokens, or if a non-expiring token is required, create a Secret API object for the token controller to populate with a service account token by following this guide.