扩容添加第一个工作节点
使能 kubectl 命令补全, 参考 How to Enable kubectl Autocompletion in Bash?:
sudo apt-get install -y bash-completion
echo "source <(kubectl completion bash)" >> ~/.bashrc
kubeadm token create --print-join-command创建一个 token 给待加入的工作节点使用.
扩容 k8s 集群-添加第二个工作节点
kubectl get pods -n kube-system查看命名空间下的所有 pod.kubectl get pods -n kube-system -o wide查看命名空间下的所有 pod 并显示更详细信息.kubectl label node b-yabin-node node-role.kubernetes.io/worker=worker给节点打标签(可选).
测试 k8s 集群网络是否正常
- 执行
kubectl run hello-world --image hello-world --restart=Never --rm -it验证是否能够启动 pod。 - 执行
kubectl run busybox --image busybox --restart=Never --rm -it busybox -- sh启动 busybox pod 并在其中执行ping www.baidu.com验证 calico 网络插件是否被正常安装了。也可以在其中 ping 任意其他的 pod。执行nslookup kubernetes.default.svc.cluster.local判断 coredns 是否正常. - 执行
kubectl get svc获取服务清单.
安装 k8s 可视化 ui 界面 dashboard
官方网站 kubernetes/dashboard. 根据官网中的介绍执行如下命令即可:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
不过考虑到国外网络环境不好, 可以将后面的文件下载下来. 然后手动执行 kubectl apply -f recommended.yaml.
执行完命令以后可以执行 watch kubectl get pods -n kubernetes-dashboard 查看是否创建完毕. 创建完毕之后执行 kubectl get pods -n kubernetes-dashboard 查看前端的服务. 执行 kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard 修改服务内容. 将其中的 type: ClusterIP 改成 type: NodePort 即可. 此时再次执行 kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard 就可以看到服务的端口已经映射到主机端口了.
主机访问的时候需要使用 https 协议来访问 dashboard 的前端. 访问时无视 https 不信任的警告继续访问即可. 登录的时候需要配置 kubeconfig 或者 token. token 的获取方式见下节.
通过 token 登录 dashboard 界面
默认 kubernetes-dashboard 会生成一个 sa. 通过 get sa -n kubernetes-dashboard 命令可以查看. 执行下面命令给这个账号进行管理员授权.
下面的命令不行, 在最新的 1.24 之后的版本.
kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:kubernetes-dashboard
执行下面命令查看 secret:
kubectl get secret -n kubernetes-dashboard
# 查看 kubernetes-dashboard-token 开头的详细信息
1.24 之后的版本创建 token 请参考: How to sign in kubernetes dashboard?. 具体生成 token 的命令如下:
kubectl create serviceaccount admin-user -n kubernetes-dashboard
kubectl create clusterrolebinding admin-user-binding -n kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin-user
kubectl -n kubernetes-dashboard create token admin-user
eyJhbGciOiJSUzI1NiIsImtpZCI6ImxIRGwwbGhydkN1aGJFQzV2c0NFNEp1QXpBMWxITmVCX1NGT1ZqN3JlRlUifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNjg3MDk4MDA4LCJpYXQiOjE2ODcwOTQ0MDgsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiNGRhZjFjZjgtM2IyNy00ZjE5LWEyOWUtZDYxYjFmN2E0NWQ0In19LCJuYmYiOjE2ODcwOTQ0MDgsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbi11c2VyIn0.WP5SGNhOGpWPlYkD0P9sHwY4nu_pRp6CKvDvAzIQBscdHAb5jrEoFTq-kOZERD_vaIUfsDMlYMeej73RxuIOdStLW2ImnTTUlGRjmHc6R4KYJShldYPMKotPpOSpJTOs13V2t9qwnDr2Y_FhnGQn3q8tawaKCbydzL2oB9gyi3jDTs_NOwDqh9BFppOhc3AEcpt9Bagu5piGQjOaZ5ObUjp_z4GspLVBia8VY7j9tXvgpm1aMBI7Fqc0_vzdk2PHkoV6Fh3agxArCh44zUn1WmeVCbHtdvKWizrsJQ_3UAWx1d6yrjtGt7w4sw8VU-QiGKJaXW0huyWirGnUNfh4iA
如果 token 失效了可以通过再次执行 kubectl -n kubernetes-dashboard create token admin-user 命令获取 token.
更加推荐的方式是官方教程, 这样创建完毕之后还可以删除这个管理员账号 Deploy and Access the Kubernetes Dashboard.
通过 kubeconfig 文件访问 dashboard
cd /etc/kubernetes/pki
#设置集群
kubectl config set-cluster kubernetes --certificate-authority=./ca.crt --server="https://192.168.127.10:6443" --embed-certs=true --kubeconfig=/root/dashboard-admin.conf
# 查看配置
cat /root/dashboard-admin.conf
# 创建 credentials
kubectl config set-credentials dashboard-admin --token [之前得到的一长串token] --kubeconfig=/root/dashboard-admin.conf
# 创建 context
kubectl config set-context dashboard-admin@kubernetes --cluster=kubernetes --user=dashboard-admin --kubeconfig=/root/dashboard-admin.conf
# 查看配置
cat /root/dashboard-admin.conf
# 切换上下文
kubectl config use-context dashboard-admin@kubernetes --kubeconfig=/root/dashboard-admin.conf
然后将生成的 dashboard-admin.conf 下载下来, 在界面登录的时候选择该文件即可. 如果 token 过期了需要再次更新文件中的 token, token 的创建方式参考之前的命令即可.
通过 dashboard 创建 pod
可以点击面板右侧的 + 创建新的 pod, 如 nginx. 服务选择外部, 端口全部填写 80. 点击部署之后等待部署完成即可. 部署完成之后, 在 Services 的 内部 Endpoints 中可以看到映射到主机的端口, 如 32527. 可以通过访问这个端口查看 nginx 是否部署成功.
安装 metrics-server 服务
根据 metrics-server 官方建议最好打开 kube-apiserver 的 --enable-aggregator-routing=true 选项以获得负载均衡的能力, 修改 /etc/kubernetes/manifests/kube-apiserver.yaml 文件在 spec/containers/command 中的 kube-apiserver 下方添加以上选项. 如:
spec:
containers:
- command:
- kube-apiserver
- --advertise-address=192.168.127.10
- --allow-privileged=true
- --enable-aggregator-routing=true
添加完毕之后, 执行 kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml 使其生效即可. 生效的过程中可以通过执行 kubectl get pods -n kube-system 查看更新过程. 此时可以发现一个名为 kube-apiserver 的 pod 状态是异常的, 这个现象是正常的, 正常提供 apiserver 服务的是下方的 kube-apiserver-b-yabin-master. 我们可以使用 kubectl delete pods kube-apiserver -n kube-system 将异常的 pods 删除.
需要注意的是如果系统已经上线很久了运行了大量的业务且只有一个主节点, 是不推荐这样做的. 因为修改选项会使得 kube-apiserver 短暂的不可用可能会影响业务.
执行以下命令即可安装 metrics-server:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml
安装的过程中可以使用 kubectl get pods -n kube-system 命令查看安装的状态, 等待 pod 可用即可. 安装的过程可能会很长, 我这里安装完毕之后 pod 的状态好不容易变成了 running 但是一直没有 ready. 使用 kubectl describe -n kube-system 查看发现给出了 Readiness probe failed: HTTP probe failed with statuscode: 500 中的错误. 更近一步使用 kubectl logs -n kube-system metrics-server-77f769d74c-flvgv 查看 pod 日志(名称根据自己的进行修改) 发现更详细的错误提示为 metrics-server error because it doesn't contain any IP SANs. 这两个 issue 给出的高赞解决方案都是手动下载配置的 yaml 文件修改其中的参数, 我这里按照给出的如下步骤成功的解决了问题:
- 执行
kubectl delete -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml删除一直无法 ready 的 pod. - 执行
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml -O metrics-server.yaml找一个地方下载配置文件. - 在配置文件中搜索
args字段添加--kubelet-insecure-tls字段并修改--metric-resolution的延迟, 我这里增加到了 45. 整体配置如下:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=45s
- --kubelet-insecure-tls
- 执行
kubectl apply -f metricis-server.yaml重新安装 pod 并通过kubectl get pods -n kube-system查看安装状态.
注意以上 yaml 文件安装的 metrics-server 要求至少有两个 node. 如果只有一个可以参考官方的另一个安装命令.
kubectl top 命令
安装完 metrics-server 之后 就可以使用 kubectl top 命令了. 使用 kubectl top pods -n kube-system 命令查看所有 pod 的 CPU 和内存使用情况.
kubectl top pods -n kube-system获取 pod 的指标.kubectl top nodes获取 node 的指标.
修改 schedule 绑定的端口
默认在 1.19 之后 10253 和 10251 都是绑定在 localhost 上的, 如果想要通过 prometheus 监控, 会采集不到数据, 所以需要将端口绑定到物理机上. 首先执行 vim /etc/kubernetes/manifests/kube-scheduler.yaml 将其中的 bind-address, livenessProbe/httpGet/host, startupProbe/httpGet/host 改为 0.0.0.0. 如果有 --port=0 需要删除, 修改后的部分内容如下:
# 其他内容
spec:
containers:
- command:
- kube-scheduler
- --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
- --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
- --bind-address=0.0.0.0
- --kubeconfig=/etc/kubernetes/scheduler.conf
- --leader-elect=true
image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.27.2
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 8
httpGet:
host: 0.0.0.0
path: /healthz
port: 10259
scheme: HTTPS
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 15
name: kube-scheduler
resources:
requests:
cpu: 100m
startupProbe:
failureThreshold: 24
httpGet:
host: 0.0.0.0
path: /healthz
port: 10259
scheme: HTTPS
# 其他内容
保存退出之后在所有节点上执行 systemctl restart kubelet 重启各个节点即可. 重启后执行 kubectl get cs 查看 scheduler 状态是否正常.
修改 controller-manager 的过程一样. 执行 vim /etc/kubernetes/manifests/kube-controller-manager.yaml 打开文件. 修改方式和 kube-scheduler.yaml 文件一样. 修改后的内容如下:
# 其他内容
- command:
- kube-controller-manager
- --allocate-node-cidrs=true
- --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
- --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
- --bind-address=0.0.0.0
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --cluster-cidr=10.244.0.0/16
- --cluster-name=kubernetes
- --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
- --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
- --controllers=*,bootstrapsigner,tokencleaner
- --kubeconfig=/etc/kubernetes/controller-manager.conf
- --leader-elect=true
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
- --root-ca-file=/etc/kubernetes/pki/ca.crt
- --service-account-private-key-file=/etc/kubernetes/pki/sa.key
- --service-cluster-ip-range=10.10.0.0/16
- --use-service-account-credentials=true
image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.27.2
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 8
httpGet:
host: 0.0.0.0
path: /healthz
port: 10257
scheme: HTTPS
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 15
name: kube-controller-manager
resources:
requests:
cpu: 200m
startupProbe:
failureThreshold: 24
httpGet:
host: 0.0.0.0
path: /healthz
port: 10257
scheme: HTTPS
initialDelaySeconds: 10
periodSeconds: 10
# 其他内容
同样通过 kubectl get cs 命令查看状态, 通过 ss -antul | grep 10259 查看端口占用情况.