Kubernetes 标准化部署文档

五陵年少金市东,银鞍白马渡春风。这篇文章主要讲述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的架构图。





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的部署?
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





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

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

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



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






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


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



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

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



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

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 # 生效



2.1.10 时间服务器同步
# 时间同步
yum install chronyd
server ntp1.aliyun.com

2.2 使用kuberadmin 部署k8s ?
2.2.1 部署角色

2.2.2 角色分配



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




2.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
2.2.5安装kubeadm,kubelet和kubectl?
由于版本更新频繁,这里指定版本号部署:
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0



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国内无法访问,这里指定阿里云镜像仓库地址。





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





2.2.8 向master 加入 节点
kubeadm join 192.168.100.11:6443 --token nl7pab.2590lw4iemtzn604 \\
--discovery-token-ca-cert-hash sha256:47bd4c128500dab38b51a79818b2c393ebbabf00d773c0dbc9b91902559cb210






2.2.9 查看节点状态
kubectl get node



2.2.9 部署网络插件flannel
wget ??https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml??


kubectl apply -f kube-flannel.yml









2.2.9 测试kubernetes集群?
在Kubernetes集群中创建一个pod,验证是否正常运行:
$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=NodePort
$ kubectl get pod,svc









2.3 使用二进制包部署k8s集群?
2.3.1 部署角色安装:

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 标准化部署文档】

    推荐阅读