目前生产部署 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方式安装:
架构图
初始操作:
使用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
安装最新的内核
yum --enablerepo=elrepo-kernel install -y kernel-lt
查看可用内核版本及启动顺序
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg
设置内核默认启动顺序
grub2-set-default 0
编辑/etc/default/grub文件
vim /etc/default/grub
设置 GRUB_DEFAULT=0
重新创建内核配置
grub2-mkconfig -o /boot/grub2/grub.cfg
重启系统
shutdown -r now
uname -r
正式操作(docker、kubeadm、kubelet、kubectl安装):
kube-proxy开启ipvs的前置条件 (建议)
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
配置使用阿里云的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查看拉取了什么组件
使用 kubectl 工具加入node节点
初始化完成后会出现两个提示
仿照输入上述内容:在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
配置flannel网络组件
下载yaml文件
官网:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
等待并查看状态
kubectl get pods -n kube-system
status选项中都是running代表组件启动已经完成
kubectl get nodes
下载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
kubectl get pod -n kube-system
找到后删除所有kube-proxy pod
kubectl delete pods kube-proxy-6cf5q kube-proxy-dvwn2 kube-proxy-jdzk5 -n kube-system
查看新pod
kubectl get pods -n kube-system
比如这个pod,查看下日志
kubectl logs kube-proxy-8xjwv -n kube-system | grep ipvs
ipvsadm -Ln
在 Kubernetes 集群中创建一个 pod,验证是否正常运行
kubectl create deployment nginx --image=nginx
kubectl get pods
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
可以看出,端口将pod中的80映射到外边的网络端口为30146
访问测试
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
发布者:LJH,转发请注明出处:https://www.ljh.cool/7947.html