1. 组件版本和配置策略

1.1 主要组件版本

组件 版本 发布时间
kubernetes v1.23.3 2022-01-26
etcd v3.5.2 2022-02-01
cri-o v1.23.0 2021-12-18
flannel v0.16.3 2022-01-29
coredns 1.9.0 2022-02-10
cni-plugins v1.0.1 2021-09-08

1.2 主要配置策略

kube-apiserver:

  • 使用节点本地 nginx 4 层透明代理实现高可用;
  • 关闭非安全端口 8080 和匿名访问;
  • 在安全端口 5443 接收 https请求;
  • 严格的认证和授权策略 (x509、token、RBAC);
  • 开启 bootstrap token 认证,支持 kubeletTLS bootstrapping;
  • 使用 https 访问 kubelet、etcd,加密通信;

kube-controller-manager:

  • 3 节点高可用; 关闭非安全端口,在安全端口 10257 接收 https 请求;
  • 使用 kubeconfig 访问 apiserver的安全端口;
  • 自动 approve kubelet 证书签名请求 (CSR),证书过期后自动轮转;
  • 各 controller 使用自己的ServiceAccount 访问 apiserver;

kube-scheduler:

  • 3 节点高可用; 使用 kubeconfig 访问 apiserver 的安全端口;
  • 关闭非安全端口,在安全端口 10259 接收https 请求;

kubelet:

  • 使用 kubeadm 动态创建 bootstrap token,而不是在 apiserver 中静态配置;
  • 使用 TLSbootstrap 机制自动生成 client 和 server 证书,过期后自动轮转;
  • 在 KubeletConfiguration类型的 JSON 文件配置主要参数;
  • 关闭只读端口,在安全端口 10250 接收 https请求,对请求进行认证和授权,拒绝匿名访问和非授权 访问;
  • 使用 kubeconfig 访问 apiserver 的安全端口;

kube-proxy:

  • 使用 kubeconfig 访问 apiserver 的安全端口;
  • 在 KubeProxyConfiguration 类型的 JSON文件配置主要参数;
  • 使用 ipvs 代理模式;

集群插件:

  • DNS:使用功能、性能更好的 coredns;

2. 初始化系统和全局变量

2.1 集群规划

master节点:

节点名称 IP地址
k8s-master-1 192.168.2.175
k8s-master-2 192.168.2.176
k8s-master-3 192.168.2.178

node 节点:

节点名称 IP地址
k8s-node-1 192.168.2.185
k8s-node-2 192.168.2.187
k8s-node-3 192.168.3.62
k8s-node-4 192.168.3.70

控制节点/配置生成节点:

节点名称 IP地址
qist 192.168.0.151

工作目录: /opt

三台机器混合部署本文档的 etcd、master 集群和 woker 集群。

如果没有特殊说明,需要在所有节点上执行本文档的初始化操作。

2.2 kubelet cri-o cgroup

Cgroup Driver:systemd
kubeelt cri-o Cgroup 配置为systemd

2.3 设置主机名

hostnamectl set-hostname k8s-master-1 # 将 k8s-master-1 替换为当前主机名

退出,重新登录 root 账号,可以看到主机名生效。

2.4 添加节点信任关系

本操作只需要在 qist 节点上进行,设置 root 账户可以无密码登录所有节点:

ssh-keygen -t rsa
ssh-copy-id root@192.168.2.175
ssh-copy-id root@192.168.2.176
ssh-copy-id root@192.168.2.177
ssh-copy-id root@192.168.2.185
ssh-copy-id root@192.168.2.187
ssh-copy-id root@192.168.3.62
ssh-copy-id root@192.168.3.70

2.5 安装依赖包

yum install -y epel-release
yum install -y chrony conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget socat git
  • kube-proxy 使用 ipvs 模式,ipvsadm 为 ipvs 的管理工具;
  • etcd 集群各机器需要时间同步,chrony用于系统时间同步;

2.6 关闭防火墙

关闭防火墙,清理防火墙规则,设置默认转发策略:

systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat

2.7 关闭 swap 分区

关闭 swap 分区,否则kubelet 会启动失败(可以设置 kubelet 启动参数 --fail-swap-on 为 false 关闭 swap检查):

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

2.8 关闭 SELinux

关闭 SELinux,否则 kubelet 挂载目录时可能报错 Permission denied :

setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

2.9 优化内核参数

cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.ipv4.tcp_slow_start_after_idle=0
net.core.rmem_max=16777216
fs.inotify.max_user_watches=1048576
kernel.softlockup_all_cpu_backtrace=1
kernel.softlockup_panic=1
fs.file-max=2097152
fs.nr_open=2097152
fs.inotify.max_user_instances=8192
fs.inotify.max_queued_events=16384
vm.max_map_count=262144
net.core.netdev_max_backlog=16384
net.ipv4.tcp_wmem=4096 12582912 16777216
net.core.wmem_max=16777216
net.core.somaxconn=32768
net.ipv4.ip_forward=1
net.ipv4.tcp_max_syn_backlog=8096
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-arptables=1
net.ipv4.tcp_rmem=4096 12582912 16777216
vm.swappiness=0
kernel.sysrq=1
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
net.ipv4.tcp_max_tw_buckets=5000
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_synack_retries=2
net.ipv6.conf.lo.disable_ipv6=1
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.all.forwarding=0
net.ipv4.ip_local_port_range=1024 65535
net.ipv4.tcp_keepalive_time=600
net.ipv4.tcp_keepalive_probes=10
net.ipv4.tcp_keepalive_intvl=30
net.nf_conntrack_max=25000000
net.netfilter.nf_conntrack_max=25000000
net.netfilter.nf_conntrack_tcp_timeout_established=180
net.netfilter.nf_conntrack_tcp_timeout_time_wait=120
net.netfilter.nf_conntrack_tcp_timeout_close_wait=60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait=12
net.ipv4.tcp_timestamps=0
net.ipv4.tcp_orphan_retries=3
fs.may_detach_mounts=1
kernel.pid_max=4194303
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_fin_timeout=1
vm.min_free_kbytes=262144
kernel.msgmnb=65535
kernel.msgmax=65535
kernel.shmmax=68719476736
kernel.shmall=4294967296
kernel.core_uses_pid=1
net.ipv4.neigh.default.gc_thresh1=0
net.ipv4.neigh.default.gc_thresh2=4096
net.ipv4.neigh.default.gc_thresh3=8192
net.netfilter.nf_conntrack_tcp_timeout_close=3
net.ipv4.conf.all.route_localnet=1 EOF
sysctl -p /etc/sysctl.d/kubernetes.conf
  • 关闭 tcp_tw_recycle,否则与 NAT 冲突,可能导致服务不通;
  • 内核低于4版本添加fs.may_detach_mounts=1

2.10 系统文件打开数

cat>>/etc/security/limits.conf<<EOF
* soft nofile 655350
* hard nofile 655350
* soft nproc 655350
* hard nproc 655350
* soft core unlimited
* hard core unlimited
EOF

centos7还需修改

sed-i's/4096/655350/'/etc/security/limits.d/20-nproc.conf

2.11 内核模块配置重启自动加载

  • 加载ipvs内核模块
cat>/etc/modules-load.d/k8s-ipvs-modules.conf<<EOF ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
EOF
  • 加载netfilter等模块
    内核4版本以下 nf_conntrack 替换 nf_conntrack_ipv4
cat>/etc/modules-load.d/k8s-net-modules.conf<<EOF br_netfilter
nf_conntrack
EOF

2.12 设置系统时区

timedatectlset-timezoneAsia/Shanghai

2.13 设置系统时钟同步

systemctl enable chronyd
systemctl start chronyd

查看同步状态:

timedatectl status

输出:

System clock synchronized: yes
NTP service: active
RTC in localTZ: no
  • System clock synchronized: yes,表示时钟已同步;
  • NTP service: active,表示开启了时钟同步服务;
#将当前的UTC时间写入硬件时钟
timedatectlset-local-rtc0
#重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond

2.14 关闭无关的服务

systemctl stop postfix && systemctl disable postfix

2.15 创建相关目录

创建目录:

  • master 组件目录
#k8s目录
mkdir -p /apps/k8s/{bin,log,conf,ssl,config}
mkdir -p /apps/work/kubernetes/{manifests,kubelet}
mkdir -p /var/lib/kubelet
mkdir- p /usr/libexec/kubernetes/kubelet-plugins/volume/exec/
mkdir -p /apps/k8s/ssl/{etcd,k8s} #etcd目录
mkdir -p /apps/etcd/{bin,conf,data,ssl} #etcd data-dir目录
mkdir -p /apps/etcd/data/default.etcd #etcdwal-dir目录
mkdir -p /apps/etcd/data/default.etcd/wal
  • node 节点目录
mkdir -p /apps/k8s/{bin,log,conf,ssl}
mkdir -p /apps/work/kubernetes/{manifests,kubelet}
mkdir -p /var/lib/kubelet
mkdir -p /usr/libexec/kubernetes/kubelet-plugins/volume/exec/
  • cri-o 目录结构创建
mkdir -p /apps/crio/{run,etc,keys}
mkdir -p /apps/crio/containers/oci/hooks.d
mkdir -p /etc/containers
mkdir -p /var/lib/containers/storage
mkdir -p /run/containers/storage
mkdir -p /apps/crio/lib/containers/storage
mkdir -p /apps/crio/run/containers/storage

2.16 mount目录挂载

  • 挂载kubelet 跟cri-o数据目录最大兼容其它依赖组件例如csi插件
cat>> /etc/fstab <<EOF
/apps/work/kubernetes/kubelet /var/lib/kubelet none defaults,bind,nofail 0 0
/apps/crio/lib/containers/storage /var/lib/containers/storage none defaults,bind,nofail 0 0
/apps/crio/run/containers/storage /run/containers/storage none defaults,bind,nofail 0 0
EOF

验证挂载是否有误

mount-a

重启机器:

sync
reboot

期待下次的分享,别忘了三连支持博主呀~
我是 念舒_C.ying ,期待你的关注~

【云原生 · Kubernetes】kubernetes v1.23.3 二进制部署(一)的更多相关文章

  1. 从零搭建云原生技术kubernetes(K8S)环境-通过kubesPhere的AllInOne方式

    前言 k8s云原生搭建,步骤有点多,但通过kubesphere,可以快速搭建k8s环境,同时有一个以 Kubernetes 为内核的云原生分布式操作系统-kubesphere,本文将从零开始进行kub ...

  2. 云原生应用 Kubernetes 监控与弹性实践

    前言 云原生应用的设计理念已经被越来越多的开发者接受与认可,而Kubernetes做为云原生的标准接口实现,已经成为了整个stack的中心,云服务的能力可以通过Cloud Provider.CRD C ...

  3. 全球首个开放应用模型 OAM 开源 | 云原生生态周报 Vol. 23

    作者 | 临石.元毅.冬岛.衷源.天元 业界要闻 全球首个开放应用模型 OAM 开源 2019 年 10 月 17 日,阿里巴巴合伙人.阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 Qcon ...

  4. 1.还不会部署高可用的kubernetes集群?看我手把手教你使用二进制部署v1.23.6的K8S集群实践(上)

    公众号关注「WeiyiGeek」 设为「特别关注」,每天带你玩转网络安全运维.应用开发.物联网IOT学习! 本章目录: 0x00 前言简述 0x01 环境准备 主机规划 软件版本 网络规划 0x02 ...

  5. 企业运维实践-还不会部署高可用的kubernetes集群?使用kubeadm方式安装高可用k8s集群v1.23.7

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...

  6. [云原生]Kubernetes - 集群搭建(第2章)

    目录 一.前置知识点 二.kubeadm部署方式介绍 三.安装要求 四.最终目标 五.准备环境 六.环境初始化 6.1 设置系统主机名以及Hosts文件的相互解析 6.2 安装依赖文件(所有节点) 6 ...

  7. 云原生生态周报 Vol.9| K8s v1.15 版本发布

    本周作者 | 衷源.心贵 业界要闻 1.Kubernetes Release v1.15 版本发布,新版本的两个主题是持续性改进和可扩展性.(https://github.com/kubernetes ...

  8. 精彩分享 | 欢乐游戏 Istio 云原生服务网格三年实践思考

    作者 吴连火,腾讯游戏专家开发工程师,负责欢乐游戏大规模分布式服务器架构.有十余年微服务架构经验,擅长分布式系统领域,有丰富的高性能高可用实践经验,目前正带领团队完成云原生技术栈的全面转型. 导语 欢 ...

  9. AMS 新闻视频广告的云原生容器化之路

    作者 卓晓光,腾讯广告高级开发工程师,负责新闻视频广告整体后台架构设计,有十余年高性能高可用海量后台服务开发和实践经验.目前正带领团队完成云原生技术栈的全面转型. 吴文祺,腾讯广告开发工程师,负责新闻 ...

  10. 云原生下基于K8S声明式GitOps持续部署工具ArgoCD实战-上

    @ 目录 概述 定义 工作原理 主要组件 核心概念 环境准备 概述 安装Kubekey 创建K8S 安装K9S OpenLB 安装ArgoCD 安装 ArgoCD CLI 从Git库中创建一个应用程序 ...

随机推荐

  1. Windows 10 Technical Preview 屏幕亮度

    下载了  Windows 10 Technical Preview 安装好之后都挺正常的,就是显卡驱动没有, 联上网络, 自动找到驱动,看起来一切都挺好的. 但是重启之后,屏幕就变得特别暗了, 亮 ...

  2. Gitea 与 Drone 集成实践:完全基于 Docker 搭建的轻量级 CI/CD 系统

    Drone 是一个使用 Go 语言编写的自助式的持续集成平台,和 Gitea 一样可以完全基于容器部署,轻松扩展流水线规模.开发者只需要将持续集成过程通过简单的 YAML 语法写入 Gitea 仓库目 ...

  3. Go工程化 - 依赖注入

    我们在微服务框架kratos v2的默认项目模板中kratos-layout使用了google/wire进行依赖注入,也建议开发者在维护项目时使用该工具. wire 乍看起来比较违反直觉,导致很多同学 ...

  4. 深度剖析Istio共享代理新模式Ambient Mesh

    摘要:今年9月份,Istio社区宣布Ambient Mesh开源,由此引发国内外众多开发者的热烈讨论. 本文分享自华为云社区<深度剖析!Istio共享代理新模式Ambient Mesh>, ...

  5. Confluence预览中文附件出现乱码

    转载自:https://blog.51cto.com/u_13776519/5329428 背景介绍: 1.使用docker方式安装运行的Confluence 2.进行了破解,使用外置数据库 3.do ...

  6. logstash知识点

    Logstash是位于Data和Elasticsearch之间的一个中间件.Logstash是一个功能强大的工具,可与各种部署集成. 它提供了大量插件. 它从数据源实时地把数据进行采集,可帮助您解析, ...

  7. CentOS6 配置阿里云 NTP 服务

    本文以Centos 6.5为例介绍如何修改Linux实例时区,以及开启和配置Linux NTP服务,保证实例本地时间精确同步. 前提条件 NTP服务的通信端口为UDP 123,设置NTP服务之前请确保 ...

  8. Docker安装集群rabbitMQ

    环境准备 Centos 7.5虚拟机三台: 192.168.102.128 192.168.102.130 192.168.102.131 以上虚拟机统一安装docker环境 三台机器分别配置如下所示 ...

  9. Elasticsearch:foreach 摄入处理器介绍---处理未知长度数组中的元素

    转载自:https://blog.csdn.net/UbuntuTouch/article/details/108621206 foreach processor 用于处理未知长度数组中的元素.这个有 ...

  10. H5调用微信支付

    这里用的是 vue项目; 首先在mounted中判断是否有openId,如果没有,则去获取 let openid = localStorage.getItem('openid'); if (!open ...