ubuntu集群安装k8s

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
 
posted @ 2023-03-15 17:11  liwinallucky  阅读(502)  评论(0)    收藏  举报