ubuntu集群安装k8s
对于1.24之上的k8s版本,默认使用安装是contained,要使用docker需要另外安装cri
禁用swap分区
第一步:修改配置
# 临时
$ swapoff -a
# 永久
$ sudo vi /etc/fstab
把下列内容第二条用#注释掉就好了,第一条别注释了,不然重启之后系统有可能会报file system read-only错误。
UUID=e2048966-750b-4795-a9a2-7b477d6681bf / ext4 errors=remount-ro 0 1
# /dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0
开机时不开swap分区
vim /etc/sysctl.conf
内容:
vm.swappiness = 0 # 不允许使用swap空间,只有包OOL错误时才使用
刷新
sysctl -p
第二步:重启
$ reboot
第三步:查看是否关闭
$ top
或者使用命令free -m查看
$ free -m
total为0证明关闭
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 39382.7 avail Mem
设置hosts
编辑主机名
vim /etc/hosts
192.168.1.201 master
192.168.1.202 Node1
192.168.1.203 Node2
复制到其他主机
scp /etc/hosts node1:/etc/
测试是否连通
ping node1
查看主机uuid
cat /sys/class/dmi/id/product_uuid
设置主机名
sudo hostnamectl set-hostname "主机名"
查看主机名
cat /etc/hostname
关闭防火墙
systemctl stop ufw.service && systemctl disable ufw.service
正确提示
Synchronizing state of ufw.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable ufw
Removed /etc/systemd/system/multi-user.target.wants/ufw.service.
开启防火态
systemctl start ufw.service
防火墙状态
systemctl status ufw.service
清空防火墙规则
iptables -F
-L : 查看配置
保存防火墙规则
service iptables save
selinux防火墙
setenforce是Linux的selinux防火墙配置命令
命令临时生效:
setenforce 0
getenforce
1 启用
0 告警,不启用
转发 IPv4 并让 iptables 看到桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
通过运行以下指令确认 br_netfilter 和 overlay 模块被加载:
lsmod | grep br_netfilter
lsmod | grep overlay
通过运行以下指令确认 net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables 和 net.ipv4.ip_forward 系统变量在你的 sysctl 配置中被设置为 1:
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
安装containerd
对于1.24之上的k8s版本,默认使用安装是contained,要使用docker需要另外安装cri
https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/
设置apt源
https://developer.aliyun.com/mirror/
直接在/etc/apt/sources.list里添加https://mirrors.aliyun.com/kubernetes/apt/是不行的,因为这个阿里镜像站使用的ssl进行传输的,所以要先安装apt-transport-https并下载镜像站的密钥才可以进行下载。
在docker-ce的镜像里面有containerd,所以直接用下面的镜像:
第一步:安装必要的依赖
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
第二步:添加 GPG 密钥
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
第三步:设置 apt 仓库
# Step 3: 写入软件源信息,在以下目录
# /etc/apt/sources.list.d/archive_uri-https_mirrors_aliyun_com_docker-ce_linux_ubuntu-jammy.list
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
第四步:安装 containerd
# Step 4: 更新并安装containerd
sudo apt-get -y update
sudo apt-get -y install containerd.io
查看可用版本,1.6.6
apt search containerd.io
查看版本
containerd -v
查看密钥
apt-key list
https://www.cnblogs.com/usmile/p/13032742.html
第五步:启用 cri 和 systemd
配置文件
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
修改映射镜像
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
# 驱动器
SystemdCgroup = true
[plugins."io.containerd.grpc.v1.cri"]
#修改映射镜像,地址在阿里云镜像网站中可以看到
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
#sandbox_image = "k8s.gcr.io/pause:3.6"
...
# 驱动器
systemd_cgroup = true
.....
# 运行时的类型,不加可能会报错
[plugins."io.containerd.grpc.v1.cri".containerd.default_runtime]
base_runtime_spec = ""
cni_conf_dir = ""
...
runtime_type="io.containerd.runtime.v1.linux"
生效
systemctl daemon-reload
重启
sudo systemctl restart containerd
重启
重启
sudo systemctl restart containerd
状态
sudo systemctl status containerd
自启
systemctl enable containerd
查看运行状态
# 查看运行状态
systemctl status containerd
查看运行状态
# 开机自启
systemctl enable containerd
# 重启containerd
systemctl restart containerd
查看版本
# 查看版本
apt-cache madison containerd
# sudo apt-get install containerd=<VERSION>
客户端版本
ctr --version
ctr version
安装kubeadm
镜像源:
https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.b5961b11eQRX5D
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
指定版本
apt-get install -y kubelet=1.24.2-00 kubeadm=1.24.2-00 kubectl=1.24.2-00
锁定版本,可选
sudo apt-mark hold kubelet kubeadm kubectl
查看可安装版本
sudo apt-cache madison kubelet
查看版本
kubeadm version
可选操作
=================
需要使用tab键补齐需要安装bash-completion
apt install bash-completion
安装之后使用
source <(kubeadm completion bash)
source <(kubectl completion bash)
source <(crictl completion bash)
设为开机生效,添加到最后
vim .bashrc
....
source <(kubeadm completion bash)
source <(kubectl completion bash)
source <(crictl completion bash)
生效
source .bashrc
==================
让主机默认使用containerd容器
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
使用这条命令后在/etc/crictl.yaml中生成
vim /etc/crictl.yaml
第二行复制一样的,时间改为10秒
runtime-endpoint: "unix:///run/containerd/containerd.sock"
image-endpoint: "unix:///run/containerd/containerd.sock"
timeout: 10
debug: false
pull-image-on-create: false
disable-pull-on-run: false
生效
systemctl daemon-reload
重启kubelet
systemctl restart kubelet
查看镜像
crictl images
拉取
crictl pull nginx
状态
systemctl status kubelet
状态
systemctl start kubelet.service
systemctl start kubeadm.service
systemctl start kubectl.service
systemctl status kubelet.service
systemctl status kubeadm.service
systemctl status kubectl.service
集群配置
启动生效
systemctl enable kubelet
初始化集群
kubeadm config print init-defaults > init.yaml
编辑初始化文件
vim init.yaml
advertiseAddress: 192.168.1.201
.....
name: master-1 # 主机名
...
imageRepository: registry.aliyuncs.com/google_containers
kubernetesVersion: 1.26.1
....
# 网段
serviceSubnet: 10.16.0.0/12
初始化
初始化文件
kubeadm init --config=init.yaml
kubeadm init --config init.yaml --ignore-preflight-errors=all
当你看到如下字样是,就说明初始化成功了,请把最后那行以kubeadm join开头的命令复制下来,之后安装工作节点时要用到的,如果你不慎遗失了该命令,可以在master节点上使用kubeadm token create --print-join-command命令来重新生成一条。
如果在初始化过程中出现了任何Error导致初始化终止了,使用kubeadm reset重置之后再重新进行初始化。
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join 192.168.56.11:6443 --token wbryr0.am1n476fgjsno6wa --discovery-token-ca-cert-hash sha256:7640582747efefe7c2d537655e428faa6275dbaff631de37822eb8fd4c054807
还原
查看kubeadm所要求的镜像
kubeadm config images list
首先查看kubeadm config 依赖的images有哪些
kubeadm config images list --config=init.yaml
重置Kubelet
尽力还原由 kubeadm init 或 kubeadm join 所做的更改
kubeadm reset
swapoff -a && kubeadm reset && systemctl daemon-reload && systemctl restart kubelet && iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
重新初始化后要删除
rm -fr /etc/kubernetes/manifests/*
kubelet 工具启动和停止
启动 kubelet 工具 =》# systemctl start kubelet
停止 kubelet 工具 =》# systemctl stop kubelet
网络用calico
https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/addons/
下载地址
https://docs.tigera.io/calico/3.25/getting-started/kubernetes/self-managed-onprem/onpremises
下载:
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml -O
配置:
vim calico.yaml
# 这个网段跟init.yml中设置的网段一致
- name: CALICO_IPV4POOL_CIDR
value: "10.96.0.0/12"
应用:
kubectl apply -f calico.yaml
查看网络
kubectl get pod --all-namespaces
加上-o wide可以显示更宽
kubectl get pod --all-namespaces -o wide
平衡coredns
kubectl --namespace kube-system rollout restart deployment coredns
webUI
https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/web-ui-dashboard/
下载:
curl https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml -O
应用:
kubectl apply -f recommended.yaml
查看命名空间:
kubectl get pod --all-namespaces
加上-o wide可以显示更宽
kubectl get pod --all-namespaces -o wide
此时还不能访问,需要映射端口:
kubectl get service --namespace kubernetes-dashboard
默认类型为ClusterIP(作用为在本集群内才可访问),需要修改:
kubectl --namespace kubernetes-dashboard edit service kubernetes-dashboard
在最下面修改内容如下(注意大小写):
....
ports:
- port: 443
protocol: TCP
targetPort: 8443
nodePort: 30000 #这里小写
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: NodePort #这里大写
....
手动创建token:
https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md
根据说明创建 dashboard-adminuser.yaml 文件,有多个用三条横线隔开:
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
应用:
kubectl apply -f dashboard-adminuser.yaml
查看用户:
kubectl --namespace kubernetes-dashboard get serviceaccounts
查看admin-user用户的信息:
kubectl --namespace kubernetes-dashboard describe serviceaccounts admin-user
没有token就需要自己创建一条:
kubectl --namespace kubernetes-dashboard create token admin-user
文件位置
查看文件,里面是变量文件位置
cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
查看日志
查看kubelet的日志
journalctl -u kubelet
journalctl -xeu kubelet
journalctl -xeu kubelet | grep Failed
删除节点
查看节点
kubectl get nodes
清空节点
kubectl drain --ignore-daemonsets <节点名称>
kubectl drain <节点名称> --delete-local-data --force --ignore-daemonsets
删除支持该节点的虚拟机
kubectl uncordon <node name>
删除节点
kubectl delete nodes <节点名称>
例:
查看节点
kubectl get nodes
驱逐这个node节点上的pod
kubectl drain node01 --delete-local-data --force --ignore-daemonsets
删除这个node节点
kubectl delete nodes node01
然后在node01这个节点上执行如下命令:
kubeadm reset
systemctl stop kubelet
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ip link delete cni0
ip link delete flannel.1
systemctl start kubelet
卸载containerd
systemctl stop containerd
apt-get purge containerd.io
# 删除contained命令及配置
rm -rf /usr/local/bin/
rm -rf /etc/containerd/
rm /etc/containerd/config.toml
# 删除containerd服务
rm -rf /usr/local/lib/systemd/system/containerd.service
# 删除runc
rm -rf /usr/local/sbin/runc
# 删除CNI插件
rm -rf /opt/cni/bin/
rm -rf /opt/containerd/
# 删除ctr命令
rm -rf /usr/bin/ctr
卸载旧版本
sudo apt-get remove containerd runc
如果需要删除镜像及容器数据则执行以下命令
sudo rm -rf /var/lib/containerd
卸载kubeadm
第一步:停止kubelet
systemctl stop kubelet
systemctl disable kubelet
第二步:
Debian / Ubuntu
sudo apt-get purge kubeadm kubectl kubelet kubernetes-cni kube*
sudo apt-get autoremove
apt-get remove 会删除软件包而保留软件的配置文件
apt-get purge 会同时清除软件包和软件的配置文件
CentOS / RHEL / Fedora
sudo yum remove -y kubeadm kubectl kubelet kubernetes-cni kube*
sudo yum autoremove -y
autoremove:当使用yum install命令安装一枚软件包时,yum会将该软件包连同其所有依赖包一并安装到本机。但当我们使用yum remove命令卸载一枚已安装软件包时,yum默认只会移除你所指定的那枚软件包,并不会移除该包的相关依赖包。自从Fedora 18之后,可以使用yum autoremove命令来干净卸载软件包。
第三步:配置清理
rm -rf /etc/systemd/system/kubelet.service
rm -rf /etc/systemd/system/kube*
最后,手动清理kubernetes配置
sudo rm -rf ~/.kube
sudo rm -rf /etc/kubernetes/
sudo rm -rf /var/lib/kube*
附录一:linux命令
查看安装包
apt list --installed
apt-get list --installed
apt list --installed | grep kubelet

浙公网安备 33010602011771号