Kubernetes 标准化部署文档

Posted 江南独孤客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes 标准化部署文档相关的知识,希望对你有一定的参考价值。



审核人

大数据运维组

重要性

紧迫性

拟制人

王昱翔

提交日期

2020 12月28

一: kubernetes的使用

1.1 kubernetes的概述与架构

1.1.1.kubernetes的概述:

kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制


Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。

在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

1.1.2 kubernetes的特点:

可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)

可扩展: 模块化,插件化,可挂载,可组合

自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展

1.2 kubernetes的体系架构

Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。下面这张图是Kubernetes的架构图。

Kubernetes



1.3 kubernetes 组件特点

在这张系统架构图中,我们把服务分为运行在工作节点上的服务和组成集群级别控制板的服务。


Kubernetes节点有运行应用容器必备的服务,而这些都是受Master的控制。


每次个节点上当然都要运行Docker。Docker来负责所有具体的映像下载和容器运行。


Kubernetes主要由以下几个核心组件组成:


etcd保存了整个集群的状态;

apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;

controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;

kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;

Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);

kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;

除了核心组件,还有一些推荐的Add-ons:


kube-dns负责为整个集群提供DNS服务

Ingress Controller为服务提供外网入口

Heapster提供资源监控

Dashboard提供GUI

Federation提供跨可用区的集群

Fluentd-elasticsearch提供集群日志采集、存储与查询


Kubernetes


Kubernetes


二:kubernetes的部署

2.1 系统环境初始化

2.1.1 安装系统简介

系统: CentOS7.9x64

部署环境:

master 三台台

Slave 三台

Kubernetes 版本: k8s-v1.18.0

系统主机名配置:

cat /etc/hosts

----

192.168.100.11 node01.flyfish.cn

192.168.100.12 node02.flyfish.cn

192.168.100.13 node03.flyfish.cn

192.168.100.14 node04.flyfish.cn

192.168.100.15 node05.flyfish.cn

192.168.100.16 node06.flyfish.cn

192.168.100.17 node07.flyfish.cn


Kubernetes


2.2 系统环境初始化

2.2.1 系统内核参数优化

cat >> /etc/sysctl.conf << EOF

fs.aio-max-nr = 1048576

fs.file-max = 6815744

net.ipv4.ip_local_port_range = 9000 65500

net.ipv4.conf.default.accept_source_route = 0

net.ipv4.tcp_max_syn_backlog = 4096

net.ipv4.conf.all.arp_filter = 1

net.core.rmem_default = 262144

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

net.core.wmem_max = 1048586

kernel.sem = 204800 512000 3000 20480

kernel.shmmax = 1073741824

kernel.shmall = 262144

kernel.shmmni = 4096

kernel.sysrq = 1

kernel.core_uses_pid = 1

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.msgmni = 2048

vm.swappiness = 10

vm.overcommit_memory = 2

vm.overcommit_ratio = 95

vm.zone_reclaim_mode = 0

vm.dirty_expire_centisecs = 500

vm.dirty_writeback_centisecs = 100

vm.dirty_background_ratio = 3

vm.dirty_ratio = 10

#64g-

#vm.dirty_background_ratio = 3

#vm.dirty_ratio = 10

#64g+

#vm.dirty_background_ratio = 0

#vm.dirty_ratio = 0

#vm.dirty_background_bytes = 1610612736

#vm.dirty_bytes = 4294967296

EOF

sysctl -p

Kubernetes

2.1.2 系统句柄数:

cat >> /etc/security/limits.conf << EOF

* soft nproc unlimited

* hard nproc unlimited

* soft nofile 524288

* hard nofile 524288

* soft stack unlimited

* hard stack unlimited

* hard memlock unlimited

* soft memlock unlimited

EOF

tail -f /etc/security/limits.conf

Kubernetes

rm -f /etc/security/limits.d/*

Kubernetes


2.1.3 系统优化启动

echo "session required pam_limits.so" >> /etc/pam.d/login

cat /etc/pam.d/login


echo "RemoveIPC=no" >> /etc/systemd/logind.conf

service systemd-logind restart

Kubernetes


Kubernetes


2.1.4 系统关闭firewalld,iptables,selinux

echo "SELINUX=disabled" > /etc/selinux/config

setenforce 0


systemctl stop firewalld.service

systemctl disable firewalld.service

systemctl status firewalld.service


systemctl set-default multi-user.target

Kubernetes

Kubernetes

2.1.5 关闭swap内存

swapoff -a && sed -i / swap / s/^\\(.*\\)$/#\\1/g /etc/fstab

Kubernetes


2.1.6 系统最大透明页

yum install numactl


vim /etc/default/grub


GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet numa=off transparent_hugepage=never elevator=deadline"


grub2-mkconfig -o /etc/grub2.cfg


numastat

numactl --show

numactl --hardware

Kubernetes

2.1.7 设置 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


Kubernetes

2.1.8 安装依赖包

yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

Kubernetes

2.1.9 将桥接的 IPv4 流量传递到 iptables 的链:

# 将桥接的IPv4流量传递到iptables的链

cat > /etc/sysctl.d/k8s.conf << EOF

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

sysctl --system # 生效

Kubernetes


2.1.10 时间服务器同步

# 时间同步

yum install chronyd

server ntp1.aliyun.com

Kubernetes

2.2 使用kuberadmin 部署k8s

2.2.1 部署角色

Kubernetes

2.2.2 角色分配

Kubernetes


node01.flyfish.cn ---> apiserver/controller-manager/scheduer/etcd

node02.flyfish.cn ----> docker/kubelet/kube-proxy/etcd/

node03.flyfish.cn ----> docker/kubelet/kube-proxy/etcd/



2.2.3 所有节点安装docker

$ wgethttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo


$ yum -y install docker-ce-18.06.1.ce-3.el7


$ systemctl enable docker && systemctl start docker


$ docker --version


Docker version 18.06.1-ce, build e68fc7a


Kubernetes

Kubernetes

Kubernetes2.2.4 添加阿里云YUM软件源

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

Kubernetes2.2.5安装kubeadm,kubelet和kubectl

由于版本更新频繁,这里指定版本号部署:

yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0


Kubernetes

2.2.6 部署Kubernetes Master

在192.168.100.11(Master)执行。

kubeadm init \\

--apiserver-advertise-address=192.168.100.11 \\

--image-repository registry.aliyuncs.com/google_containers \\

--kubernetes-version v1.18.0 \\

--service-cidr=10.96.0.0/12 \\

--pod-network-cidr=10.244.0.0/16


由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。



Kubernetes

Your Kubernetes control-plane has initialized successfully!


To start using your cluster, you need to run the following as a regular user:


mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config


You should now deploy a pod network to the cluster.

Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:

​ https://kubernetes.io/docs/concepts/cluster-administration/addons/​


Then you can join any number of worker nodes by running the following on each as root:


kubeadm join 192.168.100.11:6443 --token nl7pab.2590lw4iemtzn604 \\

--discovery-token-ca-cert-hash sha256:47bd4c128500dab38b51a79818b2c393ebbabf00d773c0dbc9b91902559cb210


2.2.7 使用kubectl工具:

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config



Kubernetes

2.2.8 向master 加入 节点

kubeadm join 192.168.100.11:6443 --token nl7pab.2590lw4iemtzn604 \\

--discovery-token-ca-cert-hash sha256:47bd4c128500dab38b51a79818b2c393ebbabf00d773c0dbc9b91902559cb210


Kubernetes


Kubernetes

2.2.9 查看节点状态

kubectl get node


Kubernetes

2.2.9 部署网络插件flannel

wget ​https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml​


kubectl apply -f kube-flannel.yml


Kubernetes


Kubernetes


Kubernetes

2.2.9 测试kubernetes集群

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

$ kubectl create deployment nginx --image=nginx

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

$ kubectl get pod,svc


Kubernetes


Kubernetes


Kubernetes

2.3 使用二进制包部署k8s集群

2.3.1 部署角色安装:

Kubernetes

2.3.2 操作系统初始化配置

# 关闭防火墙

systemctl stop firewalld

systemctl disable firewalld


# 关闭selinux

sed -i s/enforcing/disabled/ /etc/selinux/config # 永久

setenforce 0 # 临时


# 关闭swap

swapoff -a # 临时

sed -ri s/.*swap.*/#&/ /etc/fstab # 永久


# 根据规划设置主机名

hostnamectl set-hostname <hostname>


# 在master添加hosts

Kubernetes应用管理器OpenKruise之CloneSet

K8s集群上使用Helm部署2.4.6版本Rancher集群

kubernetes滚动发布服务中断问题的解决

kubernetes高级之动态准入控制

K8S系列第十篇(一键部署MySQL主从复制)

在暂停部署期间更改副本立即创建/删除 pod,但在 kubernetes 官方文档中未指定

(c)2006-2024 SYSTEM All Rights Reserved IT常识