安装k8s-v1.20.15
选择高可用方案
- 使用kube-vip方案(简单):https://qq829.cn/book/books/k8s/page/kube-vipk8s
- 【推荐】 使用keepalived方案(独立可控):https://qq829.cn/book/books/42e7a/page/dockers-composekeepalived
kube-vip方案首先要求k8s集群是正常的,才能虚拟出虚拟IP,在集群出现故障后可能导致不好排除问题,优选keepalived方案
开始安装
# 修改主机名
hostnamectl set-hostname 5-10.vpclub.io
# 修改hosts文件,将所有节点加入,为了便于后续扩展,建议为master单独增加一个主机名:kube-api-server
vi /etc/hosts
192.168.5.10 5-10.vpclub.io
192.168.5.10 kube-api-server
# 下载 k8s 安装文件
# 查看k8s 最新版本 https://dl.k8s.io/release/stable.txt
# 或者从google网站下载
# curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
# 三个主程序
wget qq829.cn/uploads/software/k8s/v1.20.15/kubeadm
wget qq829.cn/uploads/software/k8s/v1.20.15/kubelet
wget qq829.cn/uploads/software/k8s/v1.20.15/kubectl
# docker-compose
wget qq829.cn/uploads/software/k8s/docker-compose
# 服务配置文件
wget qq829.cn/uploads/software/k8s/v1.20.15/10-kubeadm.conf
wget qq829.cn/uploads/software/k8s/v1.20.15/kubelet.service
# 插件
wget qq829.cn/uploads/software/k8s/v1.20.15/calico.yaml
wget qq829.cn/uploads/software/k8s/v1.20.15/traefik-ingress.tar
# cni网络插件镜像加速
wget qq829.cn/uploads/software/k8s/v1.20.15/calico-image-vp-whdev.yaml
# 复制可执行文件到 /usr/local/bin 并给予执行权限
chmod 777 kubeadm kubelet kubectl docker-compose
cp kubeadm kubelet kubectl docker-compose /usr/local/bin
# 安装 socat conntrack 依赖软件
yum install -y socat
yum install -y conntrack
# 安装docker,修改docke运行方式
vi /etc/docker/daemon.json
{
"graph":"/data/docker",
"exec-opts": ["native.cgroupdriver=systemd"]
}
# 安装kubelet服务,开启服务自启动
# 需要注意 服务文件里面的执行路径,
cp kubelet.service /usr/lib/systemd/system/kubelet.service
mkdir -p /etc/systemd/system/kubelet.service.d
cp 10-kubeadm.conf /etc/systemd/system/kubelet.service.d
# 设置kubelet 开机启动服务
systemctl enable kubelet.service
systemctl status kubelet
多master安装(推荐,后期便于扩展多节点,前期也可以单节点使用)
# 使用kubeadm 安装
# 1.24.0 以前安装方法,会自动使用docker
# 为了便于扩展,建议apiserver使用主机名:kube-api-server:6443
kubeadm init --control-plane-endpoint "kube-api-server:6443" --image-repository registry.aliyuncs.com/google_containers --upload-certs --kubernetes-version v1.20.15 --pod-network-cidr 10.244.0.0/16 --v 5
# 打印其他master加入节点命令
echo "$(kubeadm token create --print-join-command) --control-plane --certificate-key $(kubeadm init phase upload-certs --upload-certs | tail -1)"
# 打印node加入节点命令
kubeadm token create --print-join-command
单master安装(不推荐),单节点升级为高可用请参照 https://qq829.cn/book/books/k8s/page/k8s-ZsW
# 单机安装(不推荐)
kubeadm init --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 192.168.5.10 --kubernetes-version v1.20.15 --pod-network-cidr 10.244.0.0/16 --v 5
# 重置重新安装
kubeadm reset
# 修改为ipvs模式
# 40行 , 有些是在54行,mode:"ipvs"
kubectl edit cm -n kube-system kube-proxy
# 安装cni网络插件
kubectl apply -f calico.yaml
安装ingress-controller
可以选择traefi-ingress或者nginx-ingress (推荐)
# 安装nginx-ingress
wget qq829.cn/uploads/software/k8s/v1.20.15/nginx-ingress/nginx-ingress.yaml
kubectl apply -f nginx-ingress.yaml
# 安装 traefik-controller
kubeclt apply -f 00-account.yaml -n kube-system
kubeclt apply -f 01-role.yaml -n kube-system
kubeclt apply -f 02-role-binding.yaml -n kube-system
kubeclt apply -f 03-traefik.yaml -n kube-system
kubeclt apply -f 04-traefik-services.yaml -n kube-system
kubeclt apply -f 05-traefik-default-tls.yaml -n kube-system
# 加入节点到集群
# 如果忘记了加入命令,可以再次打印
# kubeadm token create --print-join-command
k8s 证书过期重新续证书指南 https://qq829.cn/book/books/k8s/page/k3srancher
常见问题
# 某台主机太差,限制容器数量
# vi /var/lib/kubelet/kubeadm-flags.env
# --max-pods=50
# pod之间ping不通
# kubectl edit cm -n kube-system kube-proxy
# 40行,mode:"ipvs"
# 这个设置应该在安装完成k8s后就处理
k8s容器内pod ping不通的情况下,需要修改kube-proxy模式为:ipvs模式,默认模式是iptables,然后重新启动kube-proxy
# 警告: 组件 controller-manager 不健康
# 警告: 组件 scheduler 不健康
# 编辑以下文件
vi /etc/kubernetes/manifests/kube-controller-manager.yaml
vi /etc/kubernetes/manifests/kube-scheduler.yaml
# 两个文件,删除 --port=0
# calico-node 运行不起来提示 calico/node is not ready: BIRD is not ready: BGP not established
# calico-node 获取的网卡接口不对
# 增加环境变量,其中eth0是网络接口名称
IP_AUTODETECTION_METHOD = interface=eth0
# traefik-ingress 状态一直显示初始化
# traefik 增加启动参数,ingressendpoint.hostname或者ingressendpoint.hostname两个都填或者只填一个
# 同时要看情况删除(需要多次测试) --providers.kubernetesingress.ingressendpoint.publishedService
--providers.kubernetesingress.ingressendpoint.hostname=park.vpclub.io
--providers.kubernetesingress.ingressendpoint.ip=0.0.0.0
# calico-kube-controllers 异常
# 提示Failed to write status error=open /status/status.json: permission denied
# 挂载一个一个数据卷
# 主机目录/var/run/calico/status 并给予权限 777映射容器目录 /status
# 看情况或者删除健康检查
# load balance L4 一直提示 pedding
# load balance 是收费功能。k8s没有包括这个组件。应该使用 nodeport 或者 hostport
# 可以把部署的traefik 重新克隆一个,修改为DaemonSet 并公布为 host端口模式
# 误删除kube-proxy或者coredns恢复
kubeadm init phase addon kube-proxy --kubeconfig ~/.kube/config --control-plane-endpoint "kube-api-server:6443" --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.28.0 --pod-network-cidr 10.244.0.0/16
常用命令行
# 查看master组件状态
kubectl get cs
# 查看集群节点
kubectl get nodes
# 查看pod信息
kubectl get pods
# 获取发布信息
kubectl get deployments
# 查看集群信息
kubectl cluster-info
# 删除节点
kubectl delete node node42.vpclub.io
# 删除 pod
kubectl delete pod nginx-3654852276-2dt73
# 删除deployment
kubectl delete deployment nginx
# 详细日志调试工具
kubectl describe pods
# 进入容器
kubectl exec -it <nginx-webapp-2067515279-1z0lb> /bin/bash
# 查看已经部署的yml配置信息
kubectl get deploy NAME -o yaml
# 强行删除
kubectl delete pod <pod名> --grace-period=0 --force
# 为node增加label
kubectl label nodes 190.vpclub.io <label>
# 删除node的label,既在label后面加 -
kubectl label nodes 190.vpclub.io <label>-
# 修改一个label ,需要增加参数 --overwrite
kubectl label nodes 190.vpclub.io role=apache --overwrite
# 节点不参与调度,同理,恢复标记为在 label后面加 -
# 节点不参与调度并立即驱离已经存在的POD
kubectl taint nodes 190.vpclub.io node-role.kubernetes.io/master=:NoExecute
# 节点不参与调度,已经被调度的不受影响
kubectl taint nodes 190.vpclub.io node-role.kubernetes.io/master=:NoSchedule
# 重新调度一组POD
kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
# 标记为维护
kubectl cordon 17.vpclub.io
# 取消维护状态
kubectl uncordon 5-16.vpclub.io
# 删除nginx-ingress后的报错
kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
# 获取不正常的POD
kubectl get pods --all-namespaces| grep "Terminating\|OutOfpods\|CrashLoopBackOff\|Evicted\|ContainerStatusUnknown\|Error"
# 强制删除全部不正常的POD
kubectl get pods -n trade | grep "Terminating\|OutOfpods\|CrashLoopBackOff\|Evicted\|ContainerStatusUnknown\|Error" | awk '{print $1}' | xargs kubectl delete pod -n trade --force --grace-period=0
# 使用环境变量删除所有不正常的PO
_opns=kube-system && kubectl get pods -n ${_opns} | grep "Terminating\|OutOfpods\|CrashLoopBackOff\|Evicted\|ContainerStatusUnknown\|Error" | awk '{print $1}' | xargs kubectl delete pod -n ${_opns} --force --grace-period=0
# 缩放实例
kubectl scale -n devops-default --replicas=0 deployment/devops-admin-api
# 把某个NS下面的部署全部缩放为0
kubectl scale deploy --replicas=0 --all -n park-zjy
# 最近有活动d部署
kubectl get deploy --all-namespaces --sort-by=.metadata.creationTimestamp
# 查看节点cpu内存使用情况,需要先安装metrics-server
kubectl top node --sort-by memory
# 查看pod内存使用情况,需要先安装metrics-server
#kubectl top pods --sort-by memory
删除master节点
# 先安装删除node节点的方式删除节点
kubectl delete node 01.vpclub.io
# 随便找一个etcd容器,进入到容器内
kubectl exec -it etcd-00 sh -n kube-system
# 在Pod 中设置登录 ETCD 的命令(临时设置别名,退出后失效)
export ETCDCTL_API=3
alias etcdctl='etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key'
# 查看集群节点列表
etcdctl member list
# 示例:
669bc6472fb13679, started, master1, https://192.168.1.19:2380, https://192.168.1.19:2379, false
959c93e3261aadcb, started, master2, https://192.168.1.20:2380, https://192.168.1.20:2379, false
ca5f1f6f780545ba, started, master3, https://192.168.1.23:2380, https://192.168.1.23:2379, false
# 删除master3节点
etcdctl member remove ca5f1f6f780545ba