kubernets 入门(一)-----环境准备

353 阅读5分钟

Kubernetes 是一个开源的容器编排引擎,用来对容器化应用进行自动化部署、 扩缩和管理。该项目托管在 CNCF。

学习环境准备

前期准备

linux 发行版 Debian12

文章为了方便部署直接使用su用户进行操作,如果是普通用户需要添加注意添加sudo提升指令权限

更新系统

` 注意要匹配好发行版

  • 这里使用nala进行更新系统

apt update

apt install -y nala

nala fetch # 测试所有源的速度 通过序号选择 更新过程中会同时使用这些源加速更新速度

nala update

nala upgrade

k8s 安装条件

硬性要求

  • 2Core 2G 或以上机器
  • 网络通畅 集群间可以使用内网通信
  • 点之中不可以有重复的主机名、MAC 地址或 product_uuid。
  • 警用swap交换区
  • 确保通信端口开启 可以使用nc 127.0.0.1 6443检查
  • 修改hostname

hostnamectl set-hostname <`主机名`> # 确保主机名不同

  • 禁用swap分区

swapoff -a # 临时禁用 swapon -a 启用

# 注释掉/etc/fstab中swap挂载项避免重启后自动挂载

  • 安装配置br_netfilter模块

modprobe br_netfilter
# 配置 br_netfilter开机加载 
echo "br_netfilter" >> /etc/modules-load.d/netfilter.conf
 
# 重新加载 systemctl restart systemd-modules-load.service
  • 启动ip转发

echo "net.ipv4.ip_forward=1" | tee -a /etc/sysctl.conf

echo "net.bridge.bridge-nf-call-iptables=1" | tee -a /etc/sysctl.conf

sysctl -p

配置开机默认开启

nano /etc/init.d/enable_ip_forward
#!/bin/sh
### BEGIN INIT INFO
# Provides:          enable_ip_forward
# Required-Start:    $sysctl $remote_fs
# Required-Stop:
# Default-Start:     2 3 4 
# Default-Stop:      0 1 6
# Short-Description: Enable IP forwarding
### END INIT INFO
 
case "$1" in
    start)
        sysctl -w net.ipv4.ip_forward=1
        ;;
    *)
        echo "Usage: $0 start"
        exit 1
esac
 
exit 0
hmod +x /etc/init.d/enable_ip_forward
update-rc.d enable_ip_forward defaults

containerd + kubeadm引导

containerd

  • 安装containerd并启动

将containerd作为k8s的容器运行时,也可以使用如docker一类的运行时


nala install -a containerd # 常用软件使用nala安装速度更快些

systemctl enable containerd --now # 设置开启启动并启动

  • conatinerd配置

# 生成配置文件

mkdir -p /etc/containerd

containerd config default | sudo tee /etc/containerd/config.toml > /dev/null

  


# 修改配置文件

nano /etc/containerd/config.toml

# 文件中 sandbox_image做如下修改,因为后面init的时候指定的是阿里云的

sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]

SystemdCgroup = true #这个很重要,否则,k8s启动起来后会自动停止,kubectl get pods -n kube-system 也会出现监听端口6443访问失败的报错

# 修改镜像仓库地址 可以在阿里云控制台 搜索容器镜像服务->镜像加速里面拿到地址

# 和docker中的镜像配置是一个意思

[plugins."io.containerd.grpc.v1.cri".registry.mirrors]

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]

endpoint = ["https://xxxxx.mirror.aliyuncs.com"]

# 修改完成后记得重启containerd服务

systemctl restart containerd

k8s相关软件安装

引导k8s我们需要用到一下软件。

  • kubeadm:用来初始化集群的指令。

  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。

  • kubectl:用来与集群通信的命令行工具。

而其他k8s组件都会以容器形式运行。

国内使用可能因为网路原因导致部署进度缓慢甚至部署失败,所以这里使用阿里云镜像源进行加速。

  • 配置镜像源

install -y apt-transport-https ca-certificates curl

  


# 为apt添加阿里云gpg证书

curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -

  


# 添加阿里云镜像源

echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list

  


# 上面的方式是直接将gpg证书加入到apt工具中

# 在使用源时加载对应证书 两种方式都差不多

curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg

  


echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list

  


apt update # 更新软件包列表

  • 安装 kubeadm、kubelet 和 kubectl

apt-get install -y kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00

# 避免误操作 可以不执行,也可使用unhold解除

apt-mark hold kubelet kubeadm kubectl

集群引导

  • 初始化k8s集群

# 使用阿里云镜像源拉去相关镜像

# 分别操作可以避免由于镜像问题reset k8s环境

kubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \

--kubernetes-version=v1.28.2

  


# 使用阿里云镜像源 如果执行了上一步,这样不就不需要添加镜像地址了

kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.2

  


# 如果引导成功会看到类似如下内容的信息


Your Kubernetes control-plane 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:

/docs/concepts/cluster-administration/addons/

  


You can now join any number of machines by running the following on each node as root:

  


kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

  • 重置安装环境 初始化失败才需要用到

# 重置安装状态 一般情况下只需要执行这一条指令

kubeadm reset

# 重置iptables

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

# 重置ipvs表

ipvsadm -C

  • 拷贝k8s config文件

这样操作可以让用户包括普通用户也可以使用kubectl连接集群


mkdir -p $HOME/.kube

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

chown $(id -u):$(id -g) $HOME/.kube/config # 这一步可以不执行  只需要有相应访问权限即可

  


# root用户可以用一下命令

export KUBECONFIG=/etc/kubernetes/admin.conf

  • 安装网络插件

完成上面步骤后,我们执行kubectl get nodes会发现节点处于NotReady状态,这是因为缺少网络插件。常用插件包括calicoflannel等。这里使用flannel。


# 如果有必要也可以将yml下载下来

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

  • 取消控制平面隔离

默认情况下,出于安全原因,你的集群不会在控制平面节点上调度 Pod。 如果你希望能够在单机 Kubernetes 集群等控制平面节点上调度 Pod,请运行:


kubectl taint nodes --all node-role.kubernetes.io/control-plane-

  • 添加工作节点

# 在需要加入集群的节点执行

kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

# 如果缺少token可以在控制平面执行下列操作

# 列出token

kubeadm token list

# token过期了可创建新的

kubeadm token create

# 缺少hash

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \

openssl dgst -sha256 -hex | sed 's/^.* //'

问题汇总

注释掉fstab后swap开机任然自启动

debian使用systemd管理挂载swap,仅仅注释掉fstab不能完全阻止swap挂载,还需要处理systemd

sudo systemctl --type swap --all # 列出所有swap分区
systemctl mask dev-xxx.swap # 关闭相关项目 也有可能是nv开头  根据实际情况进行处理即可

参考

使用kubeadm引导集群

debian11 安装 k8s,containerd