跳转到主要内容

安装k8s-v1.20.15

选择高可用方案

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