02-k8s搭建(kubeadm方式)

目前生产部署 Kubernetes 集群主要有两种方式:

kubeadm
Kubeadm 是一个 K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署 Kubernetes 集群。

二进制包
从 github 下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。

Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可
控,推荐使用二进制包部署 Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很
多工作原理,也利于后期维护。

安装前准备

部署 Kubernetes 集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统 CentOS7.x-86_x64
- 硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
- 集群中所有机器之间网络互通
- 可以访问外网(NAT模式),需要拉取镜像
- 禁止 swap 分区(否则会报错)

kubeadm方式安装:

架构图

02-k8s搭建(kubeadm方式)

初始操作:

使用10作为master,使用11、12作为node

安装依赖包
yum install -y conntrack ntpdate ntp ipvsadm ipset iptables curl sysstat libseccomp wget vim net-tools git

设置防火墙为 Iptables 并设置空规则
systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config

关闭swap分区
临时关闭
swapoff -a
永久关闭
sed -ri 's/.swap./#&/' /etc/fstab

设置规划主机名
hostnamectl set-hostname k8s-master;bash
hostnamectl set-hostname k8s-node1;bash
hostnamectl set-hostname k8s-node2;bash

host写入配置中

cat << EOF>> /etc/hosts
192.168.1.10 k8s-master m1
192.168.1.11 k8s-node1 n1
192.168.1.12 k8s-node2 n2
EOF

将桥接的 IPv4 和IPv6流量传递到 iptables 的链
modprobe br_netfilter

cat << EOF > /etc/sysctl.d/k8s.conf 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl -p /etc/sysctl.d/k8s.conf

调整内核参数:

cat <<EOF> /etc/sysctl.d/kubernetes.conf 
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM	
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
sysctl -p /etc/sysctl.d/kubernetes.conf

sysctl --system

时间同步
yum -y install ntpdate
ntpdate ntp1.aliyun.com
查看是否同步
date +%s
将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond

可选优化操作(建议):

关闭系统不需要服务
systemctl stop postfix && systemctl disable postfix

设置 rsyslogd 和 systemd journald

mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent

# 压缩历史日志
Compress=yes

SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000

# 最大占用空间 10G
SystemMaxUse=10G

# 单日志文件最大 200M
SystemMaxFileSize=200M

# 日志保存时间 2 周
MaxRetentionSec=2week

# 不将日志转发到 syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald

升级系统内核为最新版本

rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
cat /boot/grub2/grub.cfg | grep initrd16

02-k8s搭建(kubeadm方式)

安装最新的内核
yum --enablerepo=elrepo-kernel install -y kernel-lt

查看可用内核版本及启动顺序
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg

02-k8s搭建(kubeadm方式)

设置内核默认启动顺序
grub2-set-default 0

编辑/etc/default/grub文件
vim /etc/default/grub
设置   GRUB_DEFAULT=0

02-k8s搭建(kubeadm方式)

重新创建内核配置
grub2-mkconfig -o /boot/grub2/grub.cfg

重启系统
shutdown -r now
uname -r

02-k8s搭建(kubeadm方式)

正式操作(docker、kubeadm、kubelet、kubectl安装):

kube-proxy开启ipvs的前置条件 (建议)

02-k8s搭建(kubeadm方式)
modprobe br_netfilter

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

挂载阿里源

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache

安装最新版docker(旧版可能导致最新版k8s不支持(1.23.0及以后版本只支持docker 1.20及之后版本))

yum -y install gcc
yum -y install gcc-c++
# 卸载旧版本
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
# 安装
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置stable镜像仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
# 安装docker
yum list docker-ce.x86_64 --showduplicates | sort -r #从高到低列出Docker-ce的版本
# 例如:指定版本(docker-ce-18.09.9)进行安装:
# yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io
# 安装最新版本:
yum -y install docker-ce
# 启动docker
systemctl start docker
systemctl enable docker

 docker --version

02-k8s搭建(kubeadm方式)

配置使用阿里云的docker镜像

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

systemctl daemon-reload && systemctl restart docker

使用阿里云的k8s源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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

所有节点安装 kubeadm,kubelet 和 kubectl
yum -y install kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0 --disableexcludes=kubernetes
systemctl start kubelet && systemctl enable kubelet

部署 并初始化Kubernetes Master

kubeadm init \
--apiserver-advertise-address=192.168.1.10 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

设置master节点的IP,还有使用阿里云下载k8s,选择k8s版本以及设置service和pod网段,初始化过程中可以自动使用docker拉取各个组件

最后使用docker images查看拉取了什么组件

02-k8s搭建(kubeadm方式)

使用 kubectl 工具加入node节点
初始化完成后会出现两个提示

02-k8s搭建(kubeadm方式)

仿照输入上述内容:在master中使用 kubectl 工具

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

加入node节点(node中执行,token请输入自己生成的)

kubeadm join 192.168.1.10:6443 --token r52zgg.r0c4424lnn9dmwqq \
    --discovery-token-ca-cert-hash sha256:714536643532ddcb9ab652413247c7628660dd7eb70bf40fb32ea5c106d4ce06

查看加入的节点
kubectl get nodes

02-k8s搭建(kubeadm方式)

配置flannel网络组件
下载yaml文件
官网:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

等待并查看状态
kubectl get pods -n kube-system

02-k8s搭建(kubeadm方式)

status选项中都是running代表组件启动已经完成

kubectl get nodes

02-k8s搭建(kubeadm方式)

下载k8s自动补全包(建议)

yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

# 将kubectl设置成“k”(可选)
# echo 'alias k=kubectl' >>~/.bashrc
# echo 'complete -F __start_kubectl k' >>~/.bashrc
# source ~/.bashrc

使用ipvs调度方式(建议)

kubectl edit configmap kube-proxy -n kube-system

02-k8s搭建(kubeadm方式)

kubectl  get pod -n kube-system
找到后删除所有kube-proxy pod

02-k8s搭建(kubeadm方式)

kubectl delete  pods kube-proxy-6cf5q kube-proxy-dvwn2 kube-proxy-jdzk5 -n kube-system

查看新pod
kubectl get pods -n kube-system
比如这个pod,查看下日志

02-k8s搭建(kubeadm方式)

kubectl logs kube-proxy-8xjwv -n kube-system | grep ipvs
ipvsadm -Ln

02-k8s搭建(kubeadm方式)

在 Kubernetes 集群中创建一个 pod,验证是否正常运行

kubectl create deployment nginx --image=nginx

kubectl get pods

02-k8s搭建(kubeadm方式)

kubectl expose deployment nginx --name=nginx-expose --port=80 --type=NodePort

总的来说,port和nodePort都是service的端口,前者暴露给k8s集群内部服务访问,后者暴露给k8s集群外部流量访问。从这两个端口到来的数据都需要经过反向代理kube-proxy,流入后端pod的targetPort上,最后到达pod内容器的containerPort。

kubectl get pod,svc

02-k8s搭建(kubeadm方式)

可以看出,端口将pod中的80映射到外边的网络端口为30146

访问测试

02-k8s搭建(kubeadm方式)

k8s新增node节点

新的node需要安装docker和k8s基础组件,在master节点查看集群的token值,其中TTL值默认token的有效期为24小时,当过期之后,该token就不可用了。

kubeadm token list

kubeadm token list 结果为空,说明过期了,可以master上重新生产token并获取hash值:kubeadm token create --print-join-command

02-k8s搭建(kubeadm方式)

发布者:LJH,转发请注明出处:https://www.ljh.cool/7947.html

(1)
上一篇 2022年9月14日 下午7:39
下一篇 2022年9月21日 下午7:04

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注