二进制部署k8s1.18(上)

二进制部署相对其他部署方式来说要复杂一些,步骤比较多,为了避免篇幅过长,故拆分成了三篇:

二进制部署k8s1.18(上)
二进制部署k8s1.18(中)
二进制部署k8s1.18(下)

废话不多说,直奔主题

一、基础信息

使用Kubernetes1.18.2,所有节点机操作系统是Centos7.9。本文档部署中所需kubernetes相关安装包和镜像可提前在FQ服务器上下载,然后同步到k8s部署机器上。具体信息如下:

ip地址 主机名 角色
192.168.11.11 k8s-master01 主节点1、etc节点1
192.168.11.12 k8s-master02 主节点2、etc节点2
192.168.11.13 k8s-master03 主节点3、etc节点3
192.168.11.21 k8s-node01 工作节点1
192.168.11.31 k8s-ha01 nginx节点1、harbor节点1
192.168.11.32 k8s-ha02 nginx节点2、harbor节点2

要组件版本

组件 版本
kubernetes 1.18.2
etcd 3.4.7
containerd 1.3.3
runc 1.0.0-rc10
calico 3.12.0
coredns 1.6.6
dashboard v2.0.0-rc4
k8s-prometheus-adapter 0.5.0
prometheus-operator 0.35.0
prometheus 2.15.2
elasticsearch、kibana 7.2.0
cni-plugins 0.8.5
metrics-server 0.3.6

镜像仓库:

  • harbor(两个仓库相互同步,对外提供统一入口VIP地址)
  • 主要配置策略
    kube-apiserver高可用(Nginx负载层):
  • 使用Nginx+Keepalived实现高可用, VIP1:192.168.11.250;
  • 关闭非安全端口 8080 和匿名访问;
  • 在安全端口 6443 接收 https 请求;
  • 严格的认证和授权策略 (x509、token、RBAC);
  • 开启 bootstrap token 认证,支持 kubelet TLS bootstrapping;
  • 使用 https 访问 kubelet、etcd,加密通信;

kube-controller-manager高可用:

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

kube-scheduler高可用:

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

kube-proxy:

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

集群插件:

  • DNS:使用功能、性能更好的 coredns;
  • Dashboard:支持登录认证;
  • Metric:metrics-server,使用 https 访问 kubelet 安全端口;
  • Log:Elasticsearch、Fluend、Kibana;
  • Registry 镜像库:Harbor私有仓库,两个节点相互同步;
  • kubernetes集群部署中生成的证书文件如下:
    ca-key.pem 根私钥(controller-manager配置的时候,跟上–service-account-private-key-file)
    ca.pem 根证书(apiserver配置的时候,跟上–service-account-key-file)
    kubernetes-key.pem 集群私钥
    kubernetes.pem 集群证书
    kube-proxy.pem proxy证书-node节点进行认证
    kube-proxy-key.pem proxy私钥-node节点进行认证
    admin.pem 管理员证书-主要用于kubectl认证
    admin-key.pem 管理员私钥-主要用于kubectl认证
    TLS作用:就是对通讯加密,防止中间人窃听;同时如果证书不信任的话根本就无法与 apiserver 建立连接,更不用提有没有权限向 apiserver 请求指定内容。
    RBAC作用:RBAC 中规定了一个用户或者用户组(subject)具有请求哪些 api 的权限;在配合 TLS 加密的时候,实际上 apiserver 读取客户端证书的 CN 字段作为用户名,读取 O 字段作为用户组。

总之想要与apiserver通讯就必须采用由apiserver CA签发的证书,这样才能形成信任关系,建立TLS连接;另外可通过证书的CN、O字段来提供RBAC所需用户与用户组。

kubernetes集群会默认开启RABC(角色访问控制机制),这里提前了解几个重要概念:

  • DRBC
    K8S 1.6引进,是让用户能够访问K8S API资源的授权方式(不授权就没有资格访问K8S的资源)
  • 用户
    K8S有两种用户:User 和 Service Account。其中,User给用户使用,Service Account给进程使用,让进程有相关权限。如Dashboard就是一个进程,可以创建一个Service Account给它使用。
  • 角色
    Role是一系列权限的集合,例如一个Role可包含读取和列出Pod的权限(ClusterRole和Role类似,其权限范围是整个集群)
  • 角色绑定
    RoleBinding把角色映射到用户,从而让这些用户拥有该角色的权限(ClusterRoleBinding和RoleBinding类似,可让用户拥有ClusteRole的权限)
  • Secret
    Secret是一个包含少量敏感信息如密码,令牌或密钥的对象。把这些信息保存在Secret对象中,可以在这些信息被使用时加以控制,并可以减低信息泄露的风险。

二、环境初始化准备

Kubernetes集群部署过程均需要使用root账号操作,下面初始化操作在k8s的master和node节点上操作。
这里先以k8s-master01节点为例,其他节点类似操作。

1.主机名修改
[root@k8s-master01 ~]# hostnamectl set-hostname k8s-master01

如果DNS不支持解析主机名称,则需要修改/etc/hosts文件,添加主机名和IP的对应关系:

[root@k8s-master01 ~]# cat >> /etc/hosts <<EOF
192.168.11.11   k8s-master01
192.168.11.12   k8s-master02
192.168.11.13   k8s-master03
192.168.11.11   k8s-etcd01
192.168.11.12   k8s-etcd02
192.168.11.13   k8s-etcd03
192.168.11.21   k8s-node01
EOF
  1. 添加docker账户
    [root@k8s-master01 ~]# useradd -m docker
  2. 无密码ssh信任关系
    本篇部署文档有很有操作都是在k8s-master01节点上执行,然后远程分发文件到其他节点机器上并远程执行命令,所以需要添加该节点到其它节点的ssh信任关系。
[root@k8s-master01 ~]# ssh-keygen -t rsa
[root@k8s-master01 ~]# cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
[root@k8s-master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@k8s-master01
[root@k8s-master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@k8s-master02
[root@k8s-master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@k8s-master03
[root@k8s-master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@k8s-node01

以上信任关系设置后,最好手动验证下本节点登陆到其他节点的ssh无密码信任关系

  1. 更新PATH变量,将可执行文件目录添加到PATH环境变量中
    将可执行文件目录添加到PATH环境变量中
[root@k8s-master01 ~]# echo 'PATH=/opt/k8s/bin:$PATH' >>/root/.bashrc
[root@k8s-master01 ~]# source /root/.bashrc
  1. 安装依赖包
[root@k8s-master01 ~]# yum install -y epel-release
[root@k8s-master01 ~]# yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget lsof telnet

关闭无关的服务

[root@k8s-master01 ~]# systemctl stop postfix && systemctl disable postfix
  1. 关闭防火墙
    在每台机器上关闭防火墙,清理防火墙规则,设置默认转发策略:
[root@k8s-master01 ~]# systemctl stop firewalld
[root@k8s-master01 ~]# systemctl disable firewalld
[root@k8s-master01 ~]# iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
[root@k8s-master01 ~]# iptables -P FORWARD ACCEPT
[root@k8s-master01 ~]# firewall-cmd --state
not running
  1. 关闭SELinux
    关闭SELinux,否则后续K8S挂载目录时可能报错 Permission denied:
[root@k8s-master01 ~]# setenforce 0
[root@k8s-master01 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
  1. 关闭swap分区
    如果开启了swap分区,kubelet会启动失败(可以通过将参数 --fail-swap-on 设置为false来忽略swap on),故需要在每个node节点机器上关闭swap分区。
    这里索性将所有节点的swap分区都关闭,同时注释/etc/fstab中相应的条目,防止开机自动挂载swap分区:
[root@k8s-master01 ~]# swapoff -a
[root@k8s-master01 ~]# sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
  1. 关闭dnsmasq
    linux系统开启了dnsmasq后(如 GUI 环境),将系统DNS Server设置为 127.0.0.1,这会导致docker容器无法解析域名,需要关闭它 (centos7系统可能默认没有安装这个服务)
[root@k8s-node01 ~]# systemctl stop dnsmasq
[root@k8s-node01 ~]# systemctl disable dnsmasq
  1. 加载内核模块
[root@k8s-master01 ~]# modprobe ip_vs_rr
[root@k8s-master01 ~]# modprobe br_netfilter
  1. 优化内核参数
[root@k8s-master01 ~]# 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  #由于tcp_tw_recycle与kubernetes的NAT冲突,必须关闭!否则会导致服务不通。
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  #关闭不使用的ipv6协议栈,防止触发docker BUG.
net.netfilter.nf_conntrack_max=2310720
EOF
     
[root@k8s-master01 ~]# cp kubernetes.conf  /etc/sysctl.d/kubernetes.conf
[root@k8s-master01 ~]# sysctl -p /etc/sysctl.d/kubernetes.conf

这里需要注意:
必须关闭 tcp_tw_recycle,否则和 NAT 冲突,会导致服务不通;
关闭 IPV6,防止触发 docker BUG;

  1. 设置系统时区
    #调整系统 TimeZone
    [root@k8s-master01 ~]# timedatectl set-timezone Asia/Shanghai

#将当前的 UTC 时间写入硬件时钟
[root@k8s-master01 ~]# timedatectl set-local-rtc 0

#重启依赖于系统时间的服务
[root@k8s-master01 ~]# systemctl restart rsyslog
[root@k8s-master01 ~]# systemctl restart crond

  1. 设置rsyslogd 和systemd journald (每台节点机都要操作)
    systemd 的 journald 是 Centos 7 缺省的日志记录工具,它记录了所有系统、内核、Service Unit 的日志。相比 systemd,journald 记录的日志有如下优势:
    -> 可以记录到内存或文件系统;(默认记录到内存,对应的位置为 /run/log/jounal);
    -> 可以限制占用的磁盘空间、保证磁盘剩余空间;
    -> 可以限制日志文件大小、保存的时间;
    -> journald 默认将日志转发给 rsyslog,这会导致日志写了多份,/var/log/messages 中包含了太多无关日志,不方便后续查看,同时也影响系统性能。
[root@k8s-master01 ~]# mkdir /var/log/journal           #持久化保存日志的目录
[root@k8s-master01 ~]# mkdir /etc/systemd/journald.conf.d
[root@k8s-master01 ~]# cat > 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值