k8s-V1.23.16部署以及服务部署
swap,在计算集群(请注意计算集群这四个字的含义,这种集群主要运行一些生存周期短暂的计算应用,申请大量内存-动用大量CPU-完成计算-输出结果-退出,而不是运行诸如mysql之类的服务型程序)中,我们通常希望OOM的时候直接杀掉进程,向运维或者作业提交者报错提示,并且执行故障转移,把进程在其他节点上重启起来。在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种
一、前期准备
1、三台服务器:
服务器1:Master
服务器2:Node1
服务器3:Node2
2、更换yum源
# 安装wget
yum -y install wget
# 下载阿里云yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清空本地缓存,制作阿里云缓存
yum clean all
yum makecache
3、修改主机名称
# 主节点
hostnamectl set-hostname master
# Node01节点
hostnamectl set-hostname node01
# Node02节点
hostnamectl set-hostname node02
4、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
5、 关闭Selinux
SELinux 的核心用户就是对文件的访问控制,它为需要控制访问的文件加上访问标签,采用有标签才可访问的策略进行访问控制。主要用于对一些软件可能存在漏洞,但软件还未发布补丁时起到访问控制作用。比如常用的 nginx WEB服务器软件如果存一个漏洞,可以使得攻击者能访问到 /etc/passwd 文件,但如果开启了 SELinux 同时访问文件没有nginx的访问标签, 则可以阻止通过nginx来访问 /etc/passwd 。但SELinux 的使用也给我们带来一些问题,比如一些软件还不支持这一方式,经常可能出现各种因为SELinux的开启而带来的错误,比如MySQL,如果开启动了SELinux极有可能无法启动(特别是MySQL更换数据目录,如果未设置标签)。这时我们就需要临时关闭SELinux,从而解决问题。
setenforce 0
sed -i 's/enforcing/disabled/g' /etc/selinux/config
6、关闭swap
swap,在计算集群(请注意计算集群这四个字的含义,这种集群主要运行一些生存周期短暂的计算应用,申请大量内存-动用大量CPU-完成计算-输出结果-退出,而不是运行诸如mysql之类的服务型程序)中,我们通常希望OOM的时候直接杀掉进程,向运维或者作业提交者报错提示,并且执行故障转移,把进程在其他节点上重启起来。而不是用swap续命,导致节点hang住,集群性能大幅下降,并且运维还得不到报错提示。更可怕的是有一些集群的swap位于机械硬盘阵列上,大量动用swap基本可以等同于死机,你甚至连root都登录不上,不用提杀掉问题进程了。往往结局就是硬重启。
节点hang住是非常恶劣的情况,往往发现问题的时候,已经造成了大量损失。而程序出错可以自动重试,重试还OOM说明出现了预料之外的情况(比如程序bug或是预料之外的输入、输入文件大小远超预期等问题),这种时候就应该放弃这个作业等待人员处理,而不是不停地尝试着执行它们,从而导致后面的其他作业全部完蛋。
所以计算集群通常都是关闭swap的,除非你十分明确swap可以给你的应用带来收益。
关闭swap的含义其实就是OOM了就赶紧滚蛋,让正常的程序进来继续执行,OOM的程序让用户去处理。
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
7、优化资源限制参数
ulimit -SHn 65535
cat >> /etc/security/limits.conf <<EOF
* soft nofile 65535
* hard nofile 131072
* soft nproc 65535
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
EOF
二、安装k8s
1、安装ipvsadm
yum -y install ipvsadm ipset sysstat conntrack libseccomp
2、升级内核到4.19
CentOS 7 默认的3.10版本的内核,对kubernets的支持不是很好,可以考虑升级到稳定版本的内核。
# 下载内核升级软件包
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm
# 安装
yum localinstall -y kernel-ml*
# 更改启动顺序
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
3、配置ipvs模块
在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack # 如果内核是4.19+,修改成 nf_conntrack,查看内核方法 `uname -a`或`grubby --default-kernel`
cat >> /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack #内核小于4.18,把这行改成nf_conntrack_ipv4
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF
systemctl enable --now systemd-modules-load.service
# 切记删掉注释
4、配置k8s集群内必须的内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF
sysctl --system
Kubernetes内核优化常用参数详解:
net.ipv4.ip_forward = 1 #其值为0,说明禁止进行IP转发;如果是1,则说明IP转发功能已经打开。
net.bridge.bridge-nf-call-iptables = 1 #二层的网桥在转发包时也会被iptables的FORWARD规则所过滤,这样有时会出现L3层的iptables rules去过滤L2的帧的问题
net.bridge.bridge-nf-call-ip6tables = 1 #是否在ip6tables链中过滤IPv6包
fs.may_detach_mounts = 1 #当系统有容器运行时,需要设置为1
vm.overcommit_memory=1
#0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
#1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
#2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
vm.panic_on_oom=0
#OOM就是out of memory的缩写,遇到内存耗尽、无法分配的状况。kernel面对OOM的时候,咱们也不能慌乱,要根据OOM参数来进行相应的处理。
#值为0:内存不足时,启动 OOM killer。
#值为1:内存不足时,有可能会触发 kernel panic(系统重启),也有可能启动 OOM killer。
#值为2:内存不足时,表示强制触发 kernel panic,内核崩溃GG(系统重启)。
fs.inotify.max_user_watches=89100 #表示同一用户同时可以添加的watch数目(watch一般是针对目录,决定了同时同一用户可以监控的目录数量)
fs.file-max=52706963 #所有进程最大的文件数
fs.nr_open=52706963 #单个进程可分配的最大文件数
net.netfilter.nf_conntrack_max=2310720 #连接跟踪表的大小,建议根据内存计算该值CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (x / 32),并满足nf_conntrack_max=4*nf_conntrack_buckets,默认262144
net.ipv4.tcp_keepalive_time = 600 #KeepAlive的空闲时长,或者说每次正常发送心跳的周期,默认值为7200s(2小时)
net.ipv4.tcp_keepalive_probes = 3 #在tcp_keepalive_time之后,没有接收到对方确认,继续发送保活探测包次数,默认值为9(次)
net.ipv4.tcp_keepalive_intvl =15 #KeepAlive探测包的发送间隔,默认值为75s
net.ipv4.tcp_max_tw_buckets = 36000 #Nginx 之类的中间代理一定要关注这个值,因为它对你的系统起到一个保护的作用,一旦端口全部被占用,服务就异常了。 tcp_max_tw_buckets 能帮你降低这种情况的发生概率,争取补救时间。
net.ipv4.tcp_tw_reuse = 1 #只对客户端起作用,开启后客户端在1s内回收
net.ipv4.tcp_max_orphans = 327680 #这个值表示系统所能处理不属于任何进程的socket数量,当我们需要快速建立大量连接时,就需要关注下这个值了。
net.ipv4.tcp_orphan_retries = 3
#出现大量fin-wait-1
#首先,fin发送之后,有可能会丢弃,那么发送多少次这样的fin包呢?fin包的重传,也会采用退避方式,在2.6.358内核中采用的是指数退避,2s,4s,最后的重试次数是由tcp_orphan_retries来限制的。
net.ipv4.tcp_syncookies = 1 #tcp_syncookies是一个开关,是否打开SYN Cookie功能,该功能可以防止部分SYN攻击。tcp_synack_retries和tcp_syn_retries定义SYN的重试次数。
net.ipv4.tcp_max_syn_backlog = 16384 #进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.
net.ipv4.ip_conntrack_max = 65536 #表明系统将对最大跟踪的TCP连接数限制默认为65536
net.ipv4.tcp_max_syn_backlog = 16384 #指定所能接受SYN同步包的最大客户端数量,即半连接上限;
net.ipv4.tcp_timestamps = 0 #在使用 iptables 做 nat 时,发现内网机器 ping 某个域名 ping 的通,而使用 curl 测试不通, 原来是 net.ipv4.tcp_timestamps 设置了为 1 ,即启用时间戳
net.core.somaxconn = 16384 #Linux中的一个kernel参数,表示socket监听(listen)的backlog上限。什么是backlog呢?backlog就是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。
配置完内核后,重启服务器保证重启后内核依旧加载
reboot
lsmod |grep --color=auto -e ip_vs -e nf_conntrack
5、docker安装
yum -y install yum-utils
yum-config-manager --add-repo https://mirrors.cloud.tencent.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+'''mirrors.cloud.tencent.com'''/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-20.10.17 docker-ce-cli-20.10.17
mkdir /etc/docker
cat > /etc/docker/daemon.json <<-EOF
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"log-opts": {
"max-size": "300m",
"max-file": "2"
},
"live-restore": true
}
EOF
systemctl daemon-reload
systemctl enable --now docker
6、安装kubeadm组件(Master节点)
cat > /etc/yum.repos.d/kubernetes.repo <<\EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-$basearch
enabled=1
gpgcheck=1
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
yum -y install kubeadm-1.23.16 kubelet-1.23.16 kubectl-1.23.16
systemctl daemon-reload
systemctl enable --now kubelet
7、安装kubeadm(Node节点)
cat > /etc/yum.repos.d/kubernetes.repo <<\EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-$basearch
enabled=1
gpgcheck=1
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
yum -y install kubeadm-1.23.16 kubelet-1.23.16
systemctl daemon-reload
systemctl enable --now kubelet
8、查看镜像版本
kubeadm config images list --kubernetes-version v1.23.16
# 查看国内镜像
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
9、 下载国内镜像
新建pull.sh文件
images=$(kubeadm config images list --kubernetes-version=v1.23.16 | awk -F "/" '{print $NF}')
for i in ${images};do
docker pull registry.aliyuncs.com/google_containers/$i
done
执行sh文件
10、 初始集群
kubeadm init --kubernetes-version=v1.23.16 --pod-network-cidr=110.244.0.0/16 --service-cidr=10.196.0.0/16 --image-repository=registry.aliyuncs.com/google_containers
11、部署flannel
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 修改网段为 kubeadm init 是写的 pod-network-cidr的网段
sed -ri '/"Network":/s@("Network": ).*@\1"110.244.0.0/16",@g' kube-flannel.yml
# 添加kube-flannel
kubectl apply -f kube-flannel.yml
三、服务部署
以java服务为例,部署服务
1、生成docker镜像
创建Dockerfile
FROM openjdk:8
# 服务名称
ARG server_name=template-demo
# 版本号
ARG version=v1.0
# 暴露端点
ARG export=10121
# 启动生产prod环境
ARG profiles_active=prod
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
ENV server_name $server_name
ENV version $version
ENV export $export
ENV profiles_active $profiles_active
ADD $server_name-$version.jar $server_name-$version.jar
EXPOSE $export
## docker启动按照生产环境的prod配置文件启动
ENTRYPOINT exec java -jar -Dspring.profiles.active=$profiles_active /$server_name-$version.jar
CMD echo $server_name
将参数放到sh脚本中执行命令,内容为;
docker build -t 镜像名(REPOSITORY):版本号(TAG) --build-arg server_name=服务包名 --build-arg export=端口号 --build-arg version=服务版本号 --build-arg profiles_active=启动环境 .
执行docker images命令可以看到镜像已经被打好
2、部署deployment
2.1、yaml文件部署
使用kubectl create命令生成yaml文件
kubectl create deployment 应用名称 --image=docker镜像名称 --port=端口 -n 命名空间 -o yaml --dry-run > k8s.yaml
生成的yaml文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: 应用名称
name: 应用名称
namespace: 命名空间
spec:
replicas: 副本数量
selector:
matchLabels:
app: 应用名称
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: 应用名称
spec:
containers:
- image: 镜像形成
name: pod名称
ports:
- containerPort: 容器端口
resources: {}
status: {}
yaml文件参数详解
执行命令,启动pod
kubectl apply -f k8s.yaml
2.2、json文件部署
3、部署service
部署deployment暴露的端口仅供集群内访问,集群外还需要部署service服务进行访问
更多推荐
所有评论(0)