kubernetes 集群部署
Kubernetes 集群部署
一、集群部署准备
Kubernetes有三种安装方式:
1、通过yum进行安装
2、通过二进制文件进行安装
3、命令行工具kubeadm进行安装
kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,致力于简化集群的安装过程,并解决Kubernetes集群的高可用问题。
安装 kubernetes 所需软件包: 链接:https://pan.baidu.com/s/1GoxSWAHkB3AVn9aRzGMjkQ 密码:az0o
二、部署kubernetes集群
2.1、环境准备
准备好三台虚拟机分别做为 master、node-1、node-2
虚拟机硬件配置:
master:2CPU、4G
node-1:2CPU、2G
node-2:2CPU、2G
网络配置:
master:192.168.2.20
node-1:192.168.2.21
node-2:192.168.2.22
操作系统:
Centos-8 最小化安装
主机名设置:
hostnamectl set-hostname master
# hostnamectl set-hostname node-1
# hostnamectl set-hostname node-2
设置Hosts文件的相互解析:
cat /etc/hosts
192.168.2.20 master
192.168.2.21 node-1
192.168.2.22 node-2
2.2、操作系统初始化
a、关闭swap
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
b、关闭Selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
c、关闭firewalld
systemctl stop firewalld && systemctl disable firewalld
d、重置Iptables并设置空规则:
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
e、关闭不需要的服务:
systemctl stop postfix && systemctl disable postfix
2.3、配置网络源
- 下载阿里云的yum源文件:
wget -O /etc/yum.repos.d/CentOS-Base.repo
http://mirrors.aliyun.com/repo/Centos-8.repo
- 安装epel源:
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
- 将repo 配置中的地址替换为阿里云镜像站地址:
sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
- 配置docker源:
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
ls /etc/yum.repos.d/ 有没有docker-ce.repo
- 设置kubernetes源:
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
2.4、操作系统环境优化
- 安装依赖包:
yum makecache && yum -y update 升级时遇到问题的话:
yum --nobest -y update
yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim-enhanced lrzsz net-tools git net-tools psmisc bash-completion yum-utils.noarch nmap bind-utils
- 设置系统时区:中国/上海
timedatectl set-timezone Asia/Shanghai
- 将当前的 UTC 时间写入硬件时钟:
timedatectl set-local-rtc 0
- 重启依赖于系统时间的服务:
systemctl restart rsyslog
systemctl restart crond
2.5、针对Kubernetes调整内核参数
cat > kubernetes.conf <<EOF
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
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf
2.6、设置 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 # 限制日志的生成速率-每个服务最多允许产生的日志数量(条数)
SystemMaxUse=10G # 最大占用空间 10G
SystemMaxFileSize=200M # 单日志文件最大 200M
MaxRetentionSec=2week # 日志保存时间 2 周
ForwardToSyslog=no # 不将日志转发到
syslogEOF
systemctl restart systemd-journald #重启日志服务
2.7、设置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
如果在进行配置时会报错modprobe: FATAL: Module nf_conntrack_ipv4 not found.
这是因为使用了高内核,较如博主就是使用了5.2的内核,一般教程都是3.2的内核。在高版本内核已经把nf_conntrack_ipv4替换为nf_conntrack了。所以正确配置应该如下:
# 1.安装ipset和ipvsadm
yum install ipset ipvsadmin -y
# 2.添加需要加载的模块写入脚本文件
cat <<EOF> /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
# 3.为脚本添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 4.执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
# 5.查看对应的模块是否加载成功
lsmod | grep -e -ip_vs -e nf_conntrack
“”“
nf_conntrack_netlink 49152 0
nfnetlink 20480 3 nf_conntrack_netlink,ip_set
nf_conntrack 155648 5 xt_conntrack,nf_nat,nf_conntrack_netlink,xt_MASQUERADE,ip_vs
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
nf_defrag_ipv4 16384 1 nf_conntrack
libcrc32c 16384 4 nf_conntrack,nf_nat,xfs,ip_vs
"""
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
————————————————
2.8、安装 Docker 软件
yum -y install yum-utils device-mapper-persistent-data lvm2
yum -y install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
yum -y install docker-ce
Centos 安装 Docker 报错:Error: Problem 1: problem with installed package podman-2.2.1-7.module.xxx
既然不兼容,那就卸载掉 podman ,然后在安装 Docker。
卸载 podman :
yum -y erase podman buildah
1
执行安装 Docker 命令:
yum install docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io
1
大功告成,接下来还需验证一下:
docker -v
————————————————
mkdir /etc/docker 创建 /etc/docker 目录
配置 daemon:
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors":
["https://v16stybc.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": { "max-size": "100m"
}
}
EOF
mkdir -p /etc/systemd/system/docker.service.d # systemctl daemon-reload && systemctl restart docker && systemctl enable docker
2.9、安装 Kubeadm(集群部属工具)
yum -y install kubeadm-1.18.0 kubectl-1.18.0 kubelet-1.18.0 #安装
systemctl enable kubelet.service #设置开机自启动
# kubectl 命令行工具
2.10、初始化Master节点(只操作Master)
生成系统默认的安装文件
kubeadm config print init-defaults > kubeadm-config.yaml
进行如下修改:
localAPIEndpoint:
advertiseAddress: 192.168.2.20
···
kubernetesVersion: v1.15.1
···
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: 10.96.0.0/12
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
完整配置文件如下(注意格式):
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.2.20
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: master
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.15.1
networking:
dnsDomain: cluster.local
podSubnet: "10.244.0.0/16"
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
2.11、安装配置集群
由于不能科xue上网,本地安装资源包
cd /opt
mkdir images
解压
unzip k8s-images-1.18.0.zip
删除
rx "k8s-images-1.18.0.zip"
cd images/
ls > images.txt
vim images.txt
修改后:
coredns-1.6.7.tar
etcd-3.4.3.tar
flannel-0.11.tar
kube-apiserver-1.18.0.tar
kube-controller-manager-1.18.0.tar
kube-proxy-1.18.0.tar
kube-scheduler-1.18.0.tar
pause-3.2.tar
保存
systemctl daemon-reload
systemctl restart docker.service
kubeadm reset 清空缓存
继续下面操作
- 安装Master:
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
- 添加 --upload-certs 参数可以在后续执行加入节点时自动分发证书文件。追加的 tee kubeadm-init.log 用以输出日志
安装中有如下提示,需要 复制操作
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 安装flannel网络:
''' 这里需要科xue上网 ,不用管直接继续操作
(官网地址:https://github.com/coreos/flannel)
# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
'''
上传 kube-flannel.yml到当前cd目录
kubectl apply -f kube-flannel.yml
kubectl get nodes
如果不是master Ready 则
下载后通过xftp 上传到Linux /home目录解压
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz
复制 flannel 到 /opt/cni/bin/
cp flannel /opt/cni/bin/
————————————————
- Node节点加入: 注意下面这条命令在安装完Master后会输出在屏幕上
kubeadm join 192.168.2.20:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:9f27b001d26a0ad546d91a24b7c54573a7ca855b1a6dab674877b94c7aae
kubectl create -f pod.yaml
- kubectl有很多子命令和参数,为了提高使用命令行的效率,通常建议安装 kebectl 的 bash 命令补全脚本:
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
2.12、查看集群状态
# kuberctl get nodes -o wide
集群可用性验证
# cat pod.yam
apiVersion: v1
kind: Pod
metadata:
name: nginx-2
labels:
app: web
spec:
containers:
- name: nginx
image: docker.io/nginx
ports:
- containerPort: 80
kubectl create -f pod.yaml
通过命令查看是否创建成功: kubectl get pod -o wide
通过修改容器名称将nginx修改为nginx-1后,创建第二个pod资源后查看:
kubectl get pod -n kube-system
通过curl命令查看服务是否可以正常被访问:
三、集群版本更新
这里演示的是以 K8S 1.15版本为例,具体的版本升级以你们自己实验机上安装的版本号为准!!!
yum list | grep kubeadm #查看目前可用最新版本
yum list kubeadm --showduplicates #查看所有kubeadm安装包
kubeadm提供了upgrade命令用于对kubeadm安装的Kubernetes集群进行升级,但是开始之前需要注意,虽然kubeadm的升级不会触及工作负载,但还是要在升级之前做好备份,升级过程可能会因为Pod的变化而造成容器重启。
首先执行 kubeadm upgrade plan 命令:
可以看到,我们当前使用的版本为1.15.1,最新的稳定版本为1.15.7,并且告知我们,如果想要进行升级操作,那么首先我们需要将kubeadm升级为1.15.7版本,然后执行升级命令。
执行命令 yum -y install kubeadm-1.15.7 进行升级
将kubeadm升级完成后我们执行 kubeadm upgrade apply v1.15.7 升级命令,系统询问,是否进行更新输入 Y 回车
等待片刻后,升级完成
然后再将 kubectl 与 kubelet 进行升级,然后重启 kubelet 后,
systemctl restart kubelet.service
查看节点版本已经升级为1.15.7
查看组件状态
将现在node节点也更新到1.18.1
node 下 cd /opt/images/
mkdir 1.18.1
将1.18.1l资源包及 docker-load.sh images.txt k8s-image-1.18.1.zip 放到1.18.1
cp docker-load.sh images.txt k8s-images-1.18.1.zip 1.18.1/
解压
cd 1.18.1
unzip k8s-images-1.18.1.zip
删除压缩包
rm -rf k8s-images-1.18.1.zip
将结果写入 images.txt
ls > images.txt
将images.txt里面不要的docker 和 image删除
然后
vim docker里面改路径
for IMAGES in `cat /opt/images/1.18.1/images.txt`
执行
sh docker-load.sh
yum -y install kubectl-1.18.1 kubelet-1.18.1 kubeadm-1.18.1
master 上
kubeadm upgrade node
node 上
重启
systemctl restart kubelet.service