Skip to main content

ReadHat系列安装Kubernetes

设置对应主机名

每个节点分别设置对应主机名

主节点
hostnamectl set-hostname master
从节点
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3

修改 hosts

所有节点都修改 hosts

echo "192.168.58.131 master" >> /etc/hosts
echo "192.168.58.135 node1" >> /etc/hosts
echo "192.168.58.136 node2" >> /etc/hosts
echo "192.168.58.137 node3" >> /etc/hosts

关闭 SELinux

所有节点关闭 SELinux

setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

添加 k8s 安装源

所有节点

cat <<EOF > kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
mv kubernetes.repo /etc/yum.repos.d/

CentOS7必备前置:

tc 流量转发控制

sudo yum install -y yum-utils iproute-tc 
sudo yum update -y
sudo yum clean all
sudo yum makecache fast

安装k8s所需组件

所有节点

v1.23以上版本

yum install -y kubectl kubelet kubeadm
or
yum install -y kubectl
yum install -y kubelet
yum install -y kubeadm

网络内核模块

tee /etc/modules-load.d/containerd.conf << EOF 
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter

数据包转发

tee /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

重启

sysctl --system

生成containerd的默认配置文件

所有节点

containerd config default | tee /etc/containerd/config.toml
sed -i 's#registry.k8s.io/pause:3.6#registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9#g' /etc/containerd/config.toml
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml

重启containerd

systemctl restart containerd

v1.23以上版本不包含dockershim, 旧版本如下

yum: 使用yum list <pack> --showduplicates查找所有版本

yum list kubectl --showduplicates
yum list kubeadm --showduplicates
yum list kubelet --showduplicates

1.24.0版本带containerd

yum install -y kubelet-1.24.0 kubectl-1.24.0 kubeadm-1.24.0 containerd

1.22.4版本带docker

yum install -y kubelet-1.22.4 kubectl-1.22.4 kubeadm-1.22.4 docker-ce 

添加 Docker 安装源

所有节点

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

检查安装

启动

启动kubelet、docker,并设置开机启动(所有节点)

systemctl enable kubelet --now
systemctl start kubelet
systemctl enable containerd --now
systemctl start containerd

(可选) 如果选择的是Docker

systemctl enable docker --now
systemctl start docker

检查是否加入自启

kubelet

systemctl is-enabled kubelet

(可选) Docker

systemctl is-enabled docker

查看kubectl版本

kubectl version --client --output=yaml

验证kubectl配置

kubectl cluster-info

查看kubelet版本

kubelet --version

查看kubeadm版本

kubeadm version

修改 docker 配置

所有节点都需要 kubernetes 官方推荐 docker 等使用 systemd 作为 cgroupdriver,否则 kubelet 启动不了

cat <<EOF > daemon.json 
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://ud6340vz.mirror.aliyuncs.com"]
}
EOF
mv daemon.json /etc/docker/

# 重启生效
systemctl daemon-reload
systemctl restart docker

关闭SWAP分区

注释SWAP行

vi /etc/fstab

示例: ![[Pasted image 20230419034510.png]]

配置k8s配置

主节点配置kube

其他节点需要访问集群,需要从主节点复制这个文件过去其他节点 在其他机器上创建 ~/.kube/config 文件也能通过 kubectl 访问到集群

mkdir -p $HOME/.kube  
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

初始化集群

根据你的主机类型选择一个方案, 只需要执行其一

不同云厂商的公网IP方案

  1. 建立虚拟机网卡(所有节点) 添加修改以下网卡配置
cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
BOOTPROTO=static
DEVICE=eth0:1
IPADDR=<公网IP>
PREFIX=32
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
EOF

(可选) centos8需要重启网络(所有节点)

systemctl restart network
  1. 查看是否生效(所有节点)
ip addr
  1. 修改kubelet启动参数文件(所有节点) 修改kubeadm配置, 替换<公网IP>为当前节点公网IP
echo >> /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --node-ip=<公网IP>
  1. 主节点(master)添加配置文件

内网方案

master主节点用kubeadm初始化

# 初始化集群控制台 Control plane
# 失败了可以用 kubeadm reset 重置
kubeadm init --image-repository=registry.aliyuncs.com/google_containers

(可选) 重新获取token:

kubeadm token create --print-join-command

自动补全

yum

yum install bash-completion

apt-get

apt-get install bash-completion

导入

bash

kubectl completion bash
source ~/.bashrc
(异常时) 失败运行:
echo >>  ~/.bashrc "source /usr/share/bash-completion/bash_completion"
source ~/.bashrc

验证

type _init_completion

启动 kubectl 自动补全功能

k8s

Bash

确保kubectl 补全脚本已经导入(sourced)到 Shell 会话中。 可以通过以下两种方法进行设置:

kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
sudo chmod a+r /etc/bash_completion.d/kubectl

如果 kubectl 有关联的别名,你可以扩展 Shell 补全来适配此别名:

echo 'alias ct=kubectl' >>~/.bashrc
echo 'complete -o default -F __start_kubectl ct' >>~/.bashrc

重新加载

source ~/.bashrc

Q&A

Q: [ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1 因为之前初始化过 A: 修改内核

vi /etc/sysctl.conf

net.ipv4.ip_forward = 1

重启

sysctl --system

Q: E0419 17:19:24.409506 137577 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused The connection to the server localhost:8080 was refused - did you specify the right host or port?

A:

mkdir -p $HOME/.kube 
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Q:networkPlugin cni failed to set up pod "test-k8s-68bb74d654-mc6b9_default" network: open /run/flannel/subnet.env: no such file or directory

A: 在每个节点创建文件/run/flannel/subnet.env写入以下内容,配置后等待一会就好了

mkdir /run/flannel/ && echo > "/run/flannel/subnet.env" \
"FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true"

![[II74B0FZ0AJLEX[0O3_(B.jpg]]