当前位置: 首页 > news >正文

服装加工厂网站建设方案计划书网站的劣势

服装加工厂网站建设方案计划书,网站的劣势,如何在网站中做公示信息,h5在线编辑Kubernetes入门教程 --- 使用二进制安装1. Introduction1.1 架构图1.2 关键字介绍1.3 简述2. 使用Kubeadm Install2.1 申请三个虚拟环境2.2 准备安装环境2.3 配置yum源2.4 安装Docker2.4.1 配置docker加速器并修改成k8s驱动2.5 时间同步2.6 安装组件3. 基础知识3.1 Pod3.2 控制… Kubernetes入门教程 --- 使用二进制安装1. Introduction1.1 架构图1.2 关键字介绍1.3 简述2. 使用Kubeadm Install2.1 申请三个虚拟环境2.2 准备安装环境2.3 配置yum源2.4 安装Docker2.4.1 配置docker加速器并修改成k8s驱动2.5 时间同步2.6 安装组件3. 基础知识3.1 Pod3.2 控制器3.3 通讯模式3.4 服务发现5. Awakening创建证书请求文件生成证书创建证书请求文件生成证书生成 kubelet bootstrap kubeconfig 配置文件创建证书请求文件生成证书同意请求查看Node四层负载均衡为两台Master apiserver组件提供负载均衡https://blog.csdn.net/qq_44078641/article/details/120049473 https://blog.csdn.net/qq_41009846/article/details/118612651 1. Introduction 1.1 架构图 架构图 左面的master架构 右边是node架构 1.2 关键字介绍 关键字介绍 kubectl命令行工具 Podkubernetes的最小控制单元容器都是运行在pod中的一个pod中可以有1个或者多个容器 controller负责维护集群的状态比如副本期望数量、故障检测、自动扩展、滚动更新等 api server所有服务访问的唯一入口提供认证、授权、访问控制、API 注册和发现等机制 scheduler负责资源的调度按照预定的调度策略将 Pod 调度到相应的机器上 etcd键值对数据库保存了整个集群的状态官方将它定义成一个可信赖的分布式键值存储服务 kubelet负责维护容器的生命周期同时也负责 Volume 和网络的管理 kube-proxy负责为 Service 提供 cluster 内部的服务发现和负载均衡 Container runtime负责镜像管理以及 Pod 和容器的真正运行 label标签用于对pod进行分类同一类pod会拥有相同的标签 NameSpace命名空间用来隔离pod的运行环境 1.3 简述 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 1.创建一个 Master 节点kubeadm init 2.将一个 Node 节点加入到当前集群中ubeadm join Master节点的IP和端口 2. 使用Kubeadm Install 2.1 申请三个虚拟环境 序号ip节点类型110.136.217.11master210.136.217.12mode310.136.217.13node 2.2 准备安装环境 1.关闭selinux vim /etc/selinux/config 添加 SELIUNXdisabled 并将其他两行注释掉永久关闭selinux sed -i ‘s/enforcing/disabled/’ /etc/selinux/config2.临时关闭swap内存 swapoff -a3.永久关闭swap内存 vim /etc/fstab #永久关闭swap sed -ri s/.*swap.*/#/ /etc/fstab设置host在master节点 vim /etc/hosts 调整内核参数 cat /etc/sysctl.d/kubernetes.conf EOF #开启网桥模式可将网桥的流量传递给iptables链 net.bridge.bridge-nf-call-ip6tables1 net.bridge.bridge-nf-call-iptables1 #关闭ipv6协议 net.ipv6.conf.all.disable_ipv61 net.ipv4.ip_forward1 EOF 保存参数 sysctl --system 2.3 配置yum源 配置源文件 vim /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled1 gpgcheck0 repo_gpgcheck0 gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kube2.4 安装Docker 安装wget yum install -y wget配置docker源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo安装docker yum -y install docker-ce-18.06.1.ce-3.el7开机启动docker systemctl enable docker systemctl start docker查看docker版本 docker --version守护进程重启 systemctl daemon-reload systemctl start docker避免每次使用docker都要sudo sudo usermod -aG docker xxxxx 2.4.1 配置docker加速器并修改成k8s驱动 需要重启 systemctl start docker vi /etc/docker/daemon.json {exec-opts: [native.cgroupdriversystemd],log-driver: json-file,log-opts: {max-size: 100m},storage-driver: overlay2,storage-opts: [overlay2.override_kernel_checktrue] }2.5 时间同步 安装组件 yum install ntpdate -y时间同步 ntpdate http://time.windows.com 2.6 安装组件 安装 yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0开机启动 systemctl enable kubelet systemctl start kubelet kubelet命令补全 echo “source (kubectl completion bash)” ~/.bash_profile source ~/.bash_profile 3. 基础知识 3.1 Pod kubernetes的最小管理单元是pod而不是容器所以只能将容器放在Pod中kubernetes一般也不会直接管理Pod而是通过Pod控制器来管理Pod的。 3.2 控制器 3.3 通讯模式 3.4 服务发现 5. Awakening 在一秒钟内看到本质的人和花半辈子也看不清一件事本质的人自然是不一样的命运。 一、生产环境部署k8s常见的几种方式 说明文章内使用到的yaml可到博客资源内下载 k8s-yaml 1、kubeadm Kubeadm是一个K8s部署工具提供kubeadm init和kubeadm join用于快速部署Kubernetes集群。 1 2、二进制 从github下载发行版的二进制包手动部署每个组件组成Kubernetes集群。 小结 Kubeadm降低部署门槛但屏蔽了很多细节遇到问题很难排查。如果想更容易可控推荐使用二进制包部署Kubernetes集群虽然手动部署 麻烦点期间可以学习很多工作原理也利于后期维护。 1234 3、kubespray Kubespray 是 Kubernetes incubator 中的项目目标是提供 Production Ready Kubernetes 部署方案该项目基础是通过 Ansible Playbook 来定义系统与 Kubernetes 集群部署的任务。 12 二、二进制部署 1、准备环境 服务器要求: 建议最小硬件配置: 2核CPU\2G内存\30G硬盘。服务器最好可以访问外网,会有从网上拉取镜像的需求,如果服务器不能上网,需要提前下载对应镜像导入节点。 软件环境: 软件版本操作系统CentOS7.x_x64(mini)容器引擎Docker Ce19KubernetesKubernetes V1.20 服务器规划: 角色IP组件k8s-master1192.168.242.51kube-apiserver,kube-controller-manager,kube-scheduler,kubelet,kube-proxy,docker,etcd,nginx,keepalivedk8s-master2192.168.242.54kube-apiserver,kube-controller-manager,kube-scheduler,kubelet,kube-proxy,docker,nginx,keepalivedk8s-node1192.168.242.52kubelet,kube-proxy,docker,etcdk8s-node2192.168.242.53kubelet,kube-proxy,docker,etcd负载均衡器(虚拟IP)192.168.242.55 须知: 考虑到有些朋友电脑配置较低,一次性开四台虚拟机电脑跑不动, 所以搭建这套k8s高可用集群分两部分实施,先部署一套单Master架构(三台), 再扩容为多Master架构(4台或6台), 顺便再熟悉下Master扩容流程。 12 单Master架构图 单Master服务器规划: 角色IP组件k8s-master192.168.242.51kube-apiserver,kube-controller-manager,kube-scheduler,etcdk8s-node1192.168.242.52kubelet,kube-proxy,docker,etcdk8s-node2192.168.242.53kubelet,kube-proxy,docker,etcd 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 k8s-master1 hostnamectl set-hostname k8s-master2 hostnamectl set-hostname k8s-node1 hostnamectl set-hostname k8s-node2 #添加hosts cat /etc/hosts EOF 192.168.242.51 k8s-master1 192.168.242.52 k8s-node1 192.168.242.53 k8s-node2 192.168.242.54 k8s-master2 EOF #将桥接的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 #生效 #时间同步 #使用阿里云时间服务器进行临时同步 [rootk8s-node1 ~]# ntpdate ntp.aliyun.com 4 Sep 21:27:49 ntpdate[22399]: adjust time server 203.107.6.88 offset 0.001010 sec #如需配置NTP服务可参考该文档 https://blog.csdn.net/qq_44078641/article/details/120071838 12345678910111213141516171819202122232425262728293031323334353637383940 3、部署etcd集群 3.1 etcd简介 Etcd 是一个分布式键值存储系统Kubernetes使用Etcd进行数据存储所以先准备一个Etcd数据库为解决Etcd单点故障应采用集群方式部署这里使用3台组建集群可容忍1台机器故障当然你也可以使用5台组建集群可容忍2台机器故障 3.2 服务器规划 节点名称IPetcd-1192.168.242.51etcd-2192.168.242.52etcd-2192.168.242.53说明: 为了节省机器,这里与k8s节点复用,也可以部署在k8s机器之外,只要apiserver能连接到就行。 3.3 cfssl证书生成工具准备 cfssl简介: cfssl是一个开源的证书管理工具使用json文件生成证书相比openssl更方便使用。 找任意一台服务器操作这里用Master1节点。 #创建目录存放cfssl工具 mkdir /software-cfssl#下载相关工具 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -P /software-cfssl/ wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -P /software-cfssl/ wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -P /software-cfssl/ cd /software-cfssl/ chmod x * cp cfssl_linux-amd64 /usr/local/bin/cfssl cp cfssljson_linux-amd64 /usr/local/bin/cfssljson cp cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo 12345678910111213 说明: 如果下载失败,可以使用文档中附件 cfssl工具包 3.4 自签证书颁发机构(CA) 3.4.1 创建工作目录 mkdir -p ~/TLS/{etcd,k8s} cd ~/TLS/etcd/ 12 3.4.2 生成自签CA配置 cat ca-config.json EOF {signing: {default: {expiry: 87600h},profiles: {www: {expiry: 87600h,usages: [signing,key encipherment,server auth,client auth]}}} } EOFcat ca-csr.json EOF { “CN”: “etcd CA”, “key”: { “algo”: “rsa”, “size”: 2048 }, “names”: [ { “C”: “CN”, “L”: “YuMingYu”, “ST”: “YuMingYu” } ] } EOF 1234567891011121314151617181920212223242526272829303132333435363738 3.4.3 生成自签CA证书 cfssl gencert -initca ca-csr.json | cfssljson -bare ca - 1 说明: 当前目录下会生成 ca.pem和ca-key.pem文件 [rootk8s-master1 etcd]# ls . ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem 12 3.5 使用自签CA签发etcd https证书 3.5.1 创建证书申请文件 cat server-csr.json EOF {CN: etcd,hosts: [192.168.242.51,192.168.242.52,192.168.242.53,192.168.242.54],key: {algo: rsa,size: 2048},names: [{C: CN,L: YuMingYu,ST: YuMingYu}] } EOF 12345678910111213141516171819202122 说明: 上述文件hosts字段中ip为所有etcd节点的集群内部通信ip,一个都不能少,为了方便后期扩容可以多写几个预留的ip。 3.5.2 生成证书 cfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilewww server-csr.json | cfssljson -bare server 1 说明: 当前目录下会生成 server.pem 和 server-key.pem [rootk8s-master1 etcd]# ls ca-config.json ca-csr.json ca.pem server-csr.json server.pem ca.csr ca-key.pem server.csr server-key.pem 123 3.6 下载etcd二进制文件 下载地址 #下载后上传到服务器任意位置即可 https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz 12 说明: 如果下载有问题,可使用附件中的文件。 3.7 部署etcd集群 以下操作在master1上面操作,为简化操作,待会将master1节点生成的所有文件拷贝到其他节点。 3.7.1 创建工作目录并解压二进制包 mkdir /opt/etcd/{bin,cfg,ssl} -p tar -xf etcd-v3.4.9-linux-amd64.tar.gz mv etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/1234 3.8 创建etcd配置文件 cat /opt/etcd/cfg/etcd.conf EOF #[Member] ETCD_NAMEetcd-1 ETCD_DATA_DIR/var/lib/etcd/default.etcd ETCD_LISTEN_PEER_URLShttps://192.168.242.51:2380 ETCD_LISTEN_CLIENT_URLShttps://192.168.242.51:2379#[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS“https://192.168.242.51:2380” ETCD_ADVERTISE_CLIENT_URLS“https://192.168.242.51:2379” ETCD_INITIAL_CLUSTER“etcd-1https://192.168.242.51:2380,etcd-2https://192.168.242.52:2380,etcd-3https://192.168.242.53:2380” ETCD_INITIAL_CLUSTER_TOKEN“etcd-cluster” ETCD_INITIAL_CLUSTER_STATE“new” EOF 1234567891011121314 配置说明: ETCD_NAME 节点名称,集群中唯一ETCD_DATA_DIR数据目录ETCD_LISTEN_PEER_URLS集群通讯监听地址ETCD_LISTEN_CLIENT_URLS客户端访问监听地址ETCD_INITIAL_CLUSTER集群节点地址ETCD_INITIALCLUSTER_TOKEN集群TokenETCD_INITIALCLUSTER_STATE加入集群的状态new是新集群,existing表示加入已有集群 3.9 systemd管理etcd cat /usr/lib/systemd/system/etcd.service EOF [Unit] DescriptionEtcd Server Afternetwork.target Afternetwork-online.target Wantsnetwork-online.target[Service] Typenotify EnvironmentFile/opt/etcd/cfg/etcd.conf ExecStart/opt/etcd/bin/etcd –cert-file/opt/etcd/ssl/server.pem –key-file/opt/etcd/ssl/server-key.pem –peer-cert-file/opt/etcd/ssl/server.pem –peer-key-file/opt/etcd/ssl/server-key.pem –trusted-ca-file/opt/etcd/ssl/ca.pem –peer-trusted-ca-file/opt/etcd/ssl/ca.pem –loggerzap Restarton-failure LimitNOFILE65536 [Install] WantedBymulti-user.target EOF 123456789101112131415161718192021222324 3.10 将master1节点所有生成的文件拷贝到节点2和节点3 for i in {2..3} do scp -r /opt/etcd/ root192.168.242.5$i:/opt/ scp /usr/lib/systemd/system/etcd.service root192.168.242.5$i:/usr/lib/systemd/system/ done 12345 3.11 修改节点2节点3 ,etcd.conf配置文件中的节点名称和当前服务器IP: #[Member] ETCD_NAMEetcd-1 #节点2修改为: etcd-2 节点3修改为: etcd-3 ETCD_DATA_DIR/var/lib/etcd/default.etcd ETCD_LISTEN_PEER_URLShttps://192.168.242.51:2380 #修改为对应节点IP ETCD_LISTEN_CLIENT_URLShttps://192.168.242.51:2379 #修改为对应节点IP#[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS“https://192.168.242.51:2380” #修改为对应节点IP ETCD_ADVERTISE_CLIENT_URLS“https://192.168.242.51:2379” #修改为对应节点IP ETCD_INITIAL_CLUSTER“etcd-1https://192.168.242.51:2380,etcd-2https://192.168.242.52:2380,etcd-3https://192.168.242.53:2380” ETCD_INITIAL_CLUSTER_TOKEN“etcd-cluster” ETCD_INITIAL_CLUSTER_STATE“new” 123456789101112 3.12 启动etcd并设置开机自启 说明: etcd须多个节点同时启动,不然执行systemctl start etcd会一直卡在前台,连接其他节点,建议通过批量管理工具,或者脚本同时启动etcd。 systemctl daemon-reload systemctl start etcd systemctl enable etcd 123 3.13 检查etcd集群状态 [rootk8s-master1 ~]# ETCDCTL_API3 /opt/etcd/bin/etcdctl --cacert/opt/etcd/ssl/ca.pem --cert/opt/etcd/ssl/server.pem --key/opt/etcd/ssl/server-key.pem --endpointshttps://192.168.242.51:2379,https://192.168.242.52:2379,https://192.168.242.53:2379 endpoint health --write-outtable --------------------------------------------------------- | ENDPOINT | HEALTH | TOOK | ERROR | --------------------------------------------------------- | https://192.168.242.52:2379 | true | 67.267851ms | | | https://192.168.242.51:2379 | true | 67.374967ms | | | https://192.168.242.53:2379 | true | 69.244918ms | | --------------------------------------------------------- 12345678 如果为以上状态证明部署的没有问题 3.14 etcd问题排查(日志) less /var/log/message journalctl -u etcd 12 4、安装Docker(所有节点) 这里使用Docker作为容器引擎,也可以换成别的,例如containerd,k8s在1.20版本就不在支持docker 4.1 解压二进制包 wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz tar -xf docker-19.03.9.tgz mv docker/* /usr/bin/ 123 4.2 配置镜像加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF {registry-mirrors: [https://3s9106.mirror.alncs.com] } EOF 123456 说明: 可参考: https://blog.csdn.net/qq_44078641/article/details/104366373 4.3 启动并设置开机启动 systemctl daemon-reload systemctl start docker systemctl enable docker 123 5、部署Master节点 5.1 生成kube-apiserver证书 5.1.1 自签证书颁发机构(CA) cd ~/TLS/k8scat ca-config.json EOF { “signing”: { “default”: { “expiry”: “87600h” }, “profiles”: { “kubernetes”: { “expiry”: “87600h”, “usages”: [ “signing”, “key encipherment”, “server auth”, “client auth” ] } } } } EOF cat ca-csr.json EOF { “CN”: “kubernetes”, “key”: { “algo”: “rsa”, “size”: 2048 }, “names”: [ { “C”: “CN”, “L”: “Beijing”, “ST”: “Beijing”, “O”: “k8s”, “OU”: “System” } ] } EOF 12345678910111213141516171819202122232425262728293031323334353637383940 生成证书 cfssl gencert -initca ca-csr.json | cfssljson -bare ca - 1 目录下会生成 ca.pem 和 ca-key.pem 5.1.2 使用自签CA签发kube-apiserver https证书 创建证书申请文件 cat server-csr.json EOF {CN: kubernetes,hosts: [10.0.0.1,127.0.0.1,192.168.242.51,192.168.242.52,192.168.242.53,192.168.242.54,192.168.242.55,kubernetes,kubernetes.default,kubernetes.default.svc,kubernetes.default.svc.cluster,kubernetes.default.svc.cluster.local],key: {algo: rsa,size: 2048},names: [{C: CN,L: BeiJing,ST: BeiJing,O: k8s,OU: System}] } EOF 1234567891011121314151617181920212223242526272829303132 说明: 上述文件中hosts字段中IP为所有Master/LB/VIP IP,一个都不能少,为了方便后期扩容可以多写几个预留的IP。 生成证书: cfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilekubernetes server-csr.json | cfssljson -bare server 1 说明 当前目录下会生成server.pem 和 server-key.pem文件。 5.2 下载 下载地址: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md 5.3 解压二进制包 上传刚才下载的k8s软件包到服务器上 mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs} tar zxvf kubernetes-server-linux-amd64.tar.gz cd kubernetes/server/bin cp kube-apiserver kube-scheduler kube-controller-manager /opt/kubernetes/bin cp kubectl /usr/bin/ 12345 5.4 部署kube-apiserver 5.4.1 创建配置文件 cat /opt/kubernetes/cfg/kube-apiserver.conf EOF KUBE_APISERVER_OPTS--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --etcd-servershttps://192.168.242.51:2379,https://192.168.242.52:2379,https://192.168.242.53:2379 \\ --bind-address192.168.242.51 \\ --secure-port6443 \\ --advertise-address192.168.242.51 \\ --allow-privilegedtrue \\ --service-cluster-ip-range10.0.0.0/24 \\ --enable-admission-pluginsNamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\ --authorization-modeRBAC,Node \\ --enable-bootstrap-token-authtrue \\ --token-auth-file/opt/kubernetes/cfg/token.csv \\ --service-node-port-range30000-32767 \\ --kubelet-client-certificate/opt/kubernetes/ssl/server.pem \\ --kubelet-client-key/opt/kubernetes/ssl/server-key.pem \\ --tls-cert-file/opt/kubernetes/ssl/server.pem \\ --tls-private-key-file/opt/kubernetes/ssl/server-key.pem \\ --client-ca-file/opt/kubernetes/ssl/ca.pem \\ --service-account-key-file/opt/kubernetes/ssl/ca-key.pem \\ --service-account-issuerapi \\ --service-account-signing-key-file/opt/kubernetes/ssl/server-key.pem \\ --etcd-cafile/opt/etcd/ssl/ca.pem \\ --etcd-certfile/opt/etcd/ssl/server.pem \\ --etcd-keyfile/opt/etcd/ssl/server-key.pem \\ --requestheader-client-ca-file/opt/kubernetes/ssl/ca.pem \\ --proxy-client-cert-file/opt/kubernetes/ssl/server.pem \\ --proxy-client-key-file/opt/kubernetes/ssl/server-key.pem \\ --requestheader-allowed-nameskubernetes \\ --requestheader-extra-headers-prefixX-Remote-Extra- \\ --requestheader-group-headersX-Remote-Group \\ --requestheader-username-headersX-Remote-User \\ --enable-aggregator-routingtrue \\ --audit-log-maxage30 \\ --audit-log-maxbackup3 \\ --audit-log-maxsize100 \\ --audit-log-path/opt/kubernetes/logs/k8s-audit.log EOF 123456789101112131415161718192021222324252627282930313233343536373839 说明: 上面两个\\第一个是转义符,第二个是换行符,使用转义符是为了使用EOF保留换行符。 --logtostderr 启用日志--v 日志等级--log-dir 日志目录--etcd-servers etcd集群地址--bind-address 监听地址--secure-port https安全端口--advertise-address 集群通告地址--allow-privileged 启动授权--service-cluster-ip-range Service虚拟IP地址段--enable-admission-plugins 准入控制模块--authorization-mode 认证授权,启用RBAC授权和节点自管理--enable-bootstrap-token-auth 启用TLS bootstrap机制--token-auth-file bootstrap token文件--service-node-port-range Service nodeport类型默认分配端口范围--kubelet-client-xxx apiserver访问kubelet客户端证书--tls-xxx-file apiserver https证书1.20版本必须加的参数--service-account-issuer,--service-account-signing-key-file--etcd-xxxfile 连接etcd集群证书--audit-log-xxx 审计日志启动聚合层网关配置--requestheader-client-ca-file,--proxy-client-cert-file,--proxy-client-key-file,--requestheader-allowed-names,--requestheader-extra-headers-prefix,--requestheader-group-headers,--requestheader-username-headers,--enable-aggregator-routing 5.4.2 拷贝刚才生成的证书 把刚才生成的证书拷贝到配置文件中的路径 cp ~/TLS/k8s/ca*pem ~/TLS/k8s/server*pem /opt/kubernetes/ssl/ 1 5.4.3 启用TLS bootstrapping机制 TLS BootstrapingMaster apiserver启用TLS认证后Node节点kubelet和kube-proxy要与kube-apiserver进行通信必须使用CA签发的有效证书才可以当Node节点很多时这种客户端证书颁发需要大量工作同样也会增加集群扩展复杂度。为了简化流程Kubernetes引入了TLS bootstraping机制来自动颁发客户端证书kubelet会以一个低权限用户自动向apiserver申请证书kubelet的证书由apiserver动态签署。所以强烈建议在Node上使用这种方式目前主要用于kubeletkube-proxy还是由我们统一颁发一个证书。 TLS bootstraping 工作流程 创建上述配置文件中token文件 cat /opt/kubernetes/cfg/token.csv EOF 4136692876ad4b01bb9dd0988480ebba,kubelet-bootstrap,10001,system:node-bootstrapper EOF 123 格式token,用户名,UID,用户组 token也可自行生成替换 head -c 16 /dev/urandom | od -An -t x | tr -d 1 5.4.4 systemd管理apiserver cat /usr/lib/systemd/system/kube-apiserver.service EOF [Unit] DescriptionKubernetes API Server Documentationhttps://github.com/kubernetes/kubernetes[Service] EnvironmentFile/opt/kubernetes/cfg/kube-apiserver.conf ExecStart/opt/kubernetes/bin/kube-apiserver $KUBE_APISERVER_OPTS Restarton-failure [Install] WantedBymulti-user.target EOF 12345678910111213 5.4.5 启动并设置开机启动 systemctl daemon-reload systemctl start kube-apiserver systemctl enable kube-apiserver 123 5.5 部署kube-controller-manager 5.5.1 创建配置文件 cat /opt/kubernetes/cfg/kube-controller-manager.conf EOF KUBE_CONTROLLER_MANAGER_OPTS--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --leader-electtrue \\ --kubeconfig/opt/kubernetes/cfg/kube-controller-manager.kubeconfig \\ --bind-address127.0.0.1 \\ --allocate-node-cidrstrue \\ --cluster-cidr10.244.0.0/16 \\ --service-cluster-ip-range10.0.0.0/24 \\ --cluster-signing-cert-file/opt/kubernetes/ssl/ca.pem \\ --cluster-signing-key-file/opt/kubernetes/ssl/ca-key.pem \\ --root-ca-file/opt/kubernetes/ssl/ca.pem \\ --service-account-private-key-file/opt/kubernetes/ssl/ca-key.pem \\ --cluster-signing-duration87600h0m0s EOF 12345678910111213141516 --kubeconfig 连接apiserver配置文件。--leader-elect 当该组件启动多个时,自动选举(HA)--cluster-signing-cert-file 自动为kubelet颁发证书的CA,apiserver保持一致--cluster-signing-key-file 自动为kubelet颁发证书的CA,apiserver保持一致 5.5.2 生成kubeconfig文件 生成kube-controller-manager证书 # 切换工作目录 cd ~/TLS/k8s创建证书请求文件 cat kube-controller-manager-csr.json EOF { “CN”: “system:kube-controller-manager”, “hosts”: [], “key”: { “algo”: “rsa”, “size”: 2048 }, “names”: [ { “C”: “CN”, “L”: “BeiJing”, “ST”: “BeiJing”, “O”: “system:masters”, “OU”: “System” } ] } EOF 生成证书 cfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilekubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager 1234567891011121314151617181920212223242526 生成kubeconfig文件(以下是shell命令,直接在shell终端执行) KUBE_CONFIG/opt/kubernetes/cfg/kube-controller-manager.kubeconfig KUBE_APISERVERhttps://192.168.242.51:6443kubectl config set-cluster kubernetes –certificate-authority/opt/kubernetes/ssl/ca.pem –embed-certstrue –serverKUBEAPISERVER−−kubeconfig{KUBE_APISERVER} \ --kubeconfigKUBEA​PISERVER −−kubeconfig{KUBE_CONFIG} kubectl config set-credentials kube-controller-manager –client-certificate./kube-controller-manager.pem –client-key./kube-controller-manager-key.pem –embed-certstrue –kubeconfig${KUBE_CONFIG} kubectl config set-context default –clusterkubernetes –userkube-controller-manager –kubeconfig${KUBE_CONFIG} kubectl config use-context default --kubeconfig${KUBE_CONFIG} 123456789101112131415161718192021 5.5.3 systemd管理controller-manager cat /usr/lib/systemd/system/kube-controller-manager.service EOF [Unit] DescriptionKubernetes Controller Manager Documentationhttps://github.com/kubernetes/kubernetes[Service] EnvironmentFile/opt/kubernetes/cfg/kube-controller-manager.conf ExecStart/opt/kubernetes/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_OPTS Restarton-failure [Install] WantedBymulti-user.target EOF 12345678910111213 5.5.4 启动并设置开机自启 systemctl daemon-reload systemctl start kube-controller-manager systemctl enable kube-controller-manager 123 5.6 部署 kube-scheduler 5.6.1 创建配置文件 cat /opt/kubernetes/cfg/kube-scheduler.conf EOF KUBE_SCHEDULER_OPTS--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --leader-elect \\ --kubeconfig/opt/kubernetes/cfg/kube-scheduler.kubeconfig \\ --bind-address127.0.0.1 EOF 12345678 --kubeconfig 连接apiserver配置文件--leader-elect 当该组件启动多个时,自动选举(HA)。 5.6.2 生成kubeconfig文件 生成kube-scheduler证书 # 切换工作目录 cd ~/TLS/k8s创建证书请求文件 cat kube-scheduler-csr.json EOF { “CN”: “system:kube-scheduler”, “hosts”: [], “key”: { “algo”: “rsa”, “size”: 2048 }, “names”: [ { “C”: “CN”, “L”: “BeiJing”, “ST”: “BeiJing”, “O”: “system:masters”, “OU”: “System” } ] } EOF 生成证书 cfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilekubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler 1234567891011121314151617181920212223242526 生成kubeconfig文件 KUBE_CONFIG/opt/kubernetes/cfg/kube-scheduler.kubeconfig KUBE_APISERVERhttps://192.168.242.51:6443kubectl config set-cluster kubernetes –certificate-authority/opt/kubernetes/ssl/ca.pem –embed-certstrue –serverKUBEAPISERVER−−kubeconfig{KUBE_APISERVER} \ --kubeconfigKUBEA​PISERVER −−kubeconfig{KUBE_CONFIG} kubectl config set-credentials kube-scheduler –client-certificate./kube-scheduler.pem –client-key./kube-scheduler-key.pem –embed-certstrue –kubeconfig${KUBE_CONFIG} kubectl config set-context default –clusterkubernetes –userkube-scheduler –kubeconfig${KUBE_CONFIG} kubectl config use-context default --kubeconfig${KUBE_CONFIG} 123456789101112131415161718192021 5.6.3 systemd管理scheduler cat /usr/lib/systemd/system/kube-scheduler.service EOF [Unit] DescriptionKubernetes Scheduler Documentationhttps://github.com/kubernetes/kubernetes[Service] EnvironmentFile/opt/kubernetes/cfg/kube-scheduler.conf ExecStart/opt/kubernetes/bin/kube-scheduler $KUBE_SCHEDULER_OPTS Restarton-failure [Install] WantedBymulti-user.target EOF 12345678910111213 5.6.4 启动并设置开机启动 systemctl daemon-reload systemctl start kube-scheduler systemctl enable kube-scheduler 123 5.6.5 查看集群状态 生成kubectl连接集群的证书 cat admin-csr.json EOF {CN: admin,hosts: [],key: {algo: rsa,size: 2048},names: [{C: CN,L: BeiJing,ST: BeiJing,O: system:masters,OU: System}] } EOFcfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilekubernetes admin-csr.json | cfssljson -bare admin 123456789101112131415161718192021 生成kubeconfig文件 mkdir /root/.kubeKUBE_CONFIG“/root/.kube/config” KUBE_APISERVER“https://192.168.242.51:6443” kubectl config set-cluster kubernetes –certificate-authority/opt/kubernetes/ssl/ca.pem –embed-certstrue –serverKUBEAPISERVER−−kubeconfig{KUBE_APISERVER} \ --kubeconfigKUBEA​PISERVER −−kubeconfig{KUBE_CONFIG} kubectl config set-credentials cluster-admin –client-certificate./admin.pem –client-key./admin-key.pem –embed-certstrue –kubeconfig${KUBE_CONFIG} kubectl config set-context default –clusterkubernetes –usercluster-admin –kubeconfig${KUBE_CONFIG} kubectl config use-context default --kubeconfig${KUBE_CONFIG} 1234567891011121314151617181920212223 通过kubectl工具查看当前集群组件状态 [rootk8s-master1 k8s]# kubectl get cs Warning: v1 ComponentStatus is deprecated in v1.19 NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-2 Healthy {health:true} etcd-0 Healthy {health:true} etcd-1 Healthy {health:true} 12345678 如上说明Master节点组件运行正常。 5.6.6 授权kubelet-bootstrap用户允许请求证书 kubectl create clusterrolebinding kubelet-bootstrap \ --clusterrolesystem:node-bootstrapper \ --userkubelet-bootstrap 123 6、部署Work Node 下面还是在master node上面操作,即当Master节点,也当Work Node节点 6.1 创建工作目录并拷贝二进制文件 注: 在所有work node创建工作目录 mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs} 1 从master节点k8s-server软件包中拷贝到所有work节点: #进入到k8s-server软件包目录 cd /k8s-software/kubernetes/server/bin/for i in {1…3} do scp kubelet kube-proxy root192.168.242.5$i:/opt/kubernetes/bin/ done 1234567 6.2 部署kubelet 6.2.1 创建配置文件 cat /opt/kubernetes/cfg/kubelet.conf EOF KUBELET_OPTS--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --hostname-overridek8s-master1 \\ --network-plugincni \\ --kubeconfig/opt/kubernetes/cfg/kubelet.kubeconfig \\ --bootstrap-kubeconfig/opt/kubernetes/cfg/bootstrap.kubeconfig \\ --config/opt/kubernetes/cfg/kubelet-config.yml \\ --cert-dir/opt/kubernetes/ssl \\ --pod-infra-container-imageregistry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 EOF 123456789101112 --hostname-override 显示名称,集群唯一(不可重复)。--network-plugin 启用CNI。--kubeconfig 空路径,会自动生成,后面用于连接apiserver。--bootstrap-kubeconfig 首次启动向apiserver申请证书。--config 配置文件参数。--cert-dir kubelet证书目录。--pod-infra-container-image 管理Pod网络容器的镜像 init container 6.2.2 配置文件 cat /opt/kubernetes/cfg/kubelet-config.yml EOF kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 address: 0.0.0.0 port: 10250 readOnlyPort: 10255 cgroupDriver: cgroupfs clusterDNS: - 10.0.0.2 clusterDomain: cluster.local failSwapOn: false authentication:anonymous:enabled: falsewebhook:cacheTTL: 2m0senabled: truex509:clientCAFile: /opt/kubernetes/ssl/ca.pem authorization:mode: Webhookwebhook:cacheAuthorizedTTL: 5m0scacheUnauthorizedTTL: 30s evictionHard:imagefs.available: 15%memory.available: 100Minodefs.available: 10%nodefs.inodesFree: 5% maxOpenFiles: 1000000 maxPods: 110 EOF 1234567891011121314151617181920212223242526272829303132 6.2.3 生成kubelet初次加入集群引导kubeconfig文件 KUBE_CONFIG/opt/kubernetes/cfg/bootstrap.kubeconfig KUBE_APISERVERhttps://192.168.242.51:6443 # apiserver IP:PORT TOKEN4136692876ad4b01bb9dd0988480ebba # 与token.csv里保持一致 /opt/kubernetes/cfg/token.csv 生成 kubelet bootstrap kubeconfig 配置文件 kubectl config set-cluster kubernetes –certificate-authority/opt/kubernetes/ssl/ca.pem –embed-certstrue –serverKUBEAPISERVER−−kubeconfig{KUBE_APISERVER} \ --kubeconfigKUBEA​PISERVER −−kubeconfig{KUBE_CONFIG} kubectl config set-credentials “kubelet-bootstrap” –tokenTOKEN−−kubeconfig{TOKEN} \ --kubeconfigTOKEN −−kubeconfig{KUBE_CONFIG} kubectl config set-context default –clusterkubernetes –user“kubelet-bootstrap” –kubeconfig${KUBE_CONFIG} kubectl config use-context default --kubeconfig${KUBE_CONFIG} 123456789101112131415161718192021 6.2.4 systemd管理kubelet cat /usr/lib/systemd/system/kubelet.service EOF [Unit] DescriptionKubernetes Kubelet Afterdocker.service[Service] EnvironmentFile/opt/kubernetes/cfg/kubelet.conf ExecStart/opt/kubernetes/bin/kubelet $KUBELET_OPTS Restarton-failure LimitNOFILE65536 [Install] WantedBymulti-user.target EOF 1234567891011121314 6.2.5 启动并设置开机启动 systemctl daemon-reload systemctl start kubelet systemctl enable kubelet 123 6.2.6 允许kubelet证书申请并加入集群 #查看kubelet证书请求 [rootk8s-master1 bin]# kubectl get csr NAME AGE SIGNERNAME REQUESTOR CONDITION node-csr-KbHieprZUMOvTFMHGQ1RNTZEhsSlT5X6wsh2lzfUry4 107s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending#允许kubelet节点申请 [rootk8s-master1 bin]# kubectl certificate approve node-csr-KbHieprZUMOvTFMHGQ1RNTZEhsSlT5X6wsh2lzfUry4 certificatesigningrequest.certificates.k8s.io/node-csr-KbHieprZUMOvTFMHGQ1RNTZEhsSlT5X6wsh2lzfUry4 approved #查看申请 [rootk8s-master1 bin]# kubectl get csr NAME AGE SIGNERNAME REQUESTOR CONDITION node-csr-KbHieprZUMOvTFMHGQ1RNTZEhsSlT5X6wsh2lzfUry4 2m35s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued #查看节点 [rootk8s-master1 bin]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master1 NotReady none 2m11s v1.20.10 123456789101112131415161718 说明 由于网络插件还没有部署,节点会没有准备就绪NotReady 6.3 部署kube-proxy 6.3.1 创建配置文件 cat /opt/kubernetes/cfg/kube-proxy.conf EOF KUBE_PROXY_OPTS--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --config/opt/kubernetes/cfg/kube-proxy-config.yml EOF 123456 6.3.2 配置参数文件 cat /opt/kubernetes/cfg/kube-proxy-config.yml EOF kind: KubeProxyConfiguration apiVersion: kubeproxy.config.k8s.io/v1alpha1 bindAddress: 0.0.0.0 metricsBindAddress: 0.0.0.0:10249 clientConnection:kubeconfig: /opt/kubernetes/cfg/kube-proxy.kubeconfig hostnameOverride: k8s-master1 clusterCIDR: 10.244.0.0/16 EOF 12345678910 6.3.3 生成kube-proxy证书文件 # 切换工作目录 cd ~/TLS/k8s创建证书请求文件 cat kube-proxy-csr.json EOF { “CN”: “system:kube-proxy”, “hosts”: [], “key”: { “algo”: “rsa”, “size”: 2048 }, “names”: [ { “C”: “CN”, “L”: “BeiJing”, “ST”: “BeiJing”, “O”: “k8s”, “OU”: “System” } ] } EOF 生成证书 cfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilekubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy 123456789101112131415161718192021222324252627 6.3.4 生成kube-proxy.kubeconfig文件 KUBE_CONFIG/opt/kubernetes/cfg/kube-proxy.kubeconfig KUBE_APISERVERhttps://192.168.242.51:6443kubectl config set-cluster kubernetes –certificate-authority/opt/kubernetes/ssl/ca.pem –embed-certstrue –serverKUBEAPISERVER−−kubeconfig{KUBE_APISERVER} \ --kubeconfigKUBEA​PISERVER −−kubeconfig{KUBE_CONFIG} kubectl config set-credentials kube-proxy –client-certificate./kube-proxy.pem –client-key./kube-proxy-key.pem –embed-certstrue –kubeconfig${KUBE_CONFIG} kubectl config set-context default –clusterkubernetes –userkube-proxy –kubeconfig${KUBE_CONFIG} kubectl config use-context default --kubeconfig${KUBE_CONFIG} 123456789101112131415161718192021 6.3.5 systemd管理kube-proxy cat /usr/lib/systemd/system/kube-proxy.service EOF [Unit] DescriptionKubernetes Proxy Afternetwork.target[Service] EnvironmentFile/opt/kubernetes/cfg/kube-proxy.conf ExecStart/opt/kubernetes/bin/kube-proxy $KUBE_PROXY_OPTS Restarton-failure LimitNOFILE65536 [Install] WantedBymulti-user.target EOF 1234567891011121314 6.3.6 启动并设置开机自启 systemctl daemon-reload systemctl start kube-proxy systemctl enable kube-proxy 123 6.4 部署网络组件(Calico) Calico是一个纯三层的数据中心网络方案是目前Kubernetes主流的网络方案。 kubectl apply -f calico.yaml kubectl get pods -n kube-system 12 等Calico Pod都Running,节点也会准备就绪。 [rootk8s-master1 yaml]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-97769f7c7-zcz5d 1/1 Running 0 3m11s calico-node-5tnll 1/1 Running 0 3m11s[rootk8s-master1 yaml]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master1 Ready none 21m v1.20.10 12345678 6.5 授权apiserver访问kubelet 应用场景如kubectl logs cat apiserver-to-kubelet-rbac.yaml EOF apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:annotations:rbac.authorization.kubernetes.io/autoupdate: truelabels:kubernetes.io/bootstrapping: rbac-defaultsname: system:kube-apiserver-to-kubelet rules:- apiGroups:- resources:- nodes/proxy- nodes/stats- nodes/log- nodes/spec- nodes/metrics- pods/logverbs:- * --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: system:kube-apiservernamespace: roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: system:kube-apiserver-to-kubelet subjects:- apiGroup: rbac.authorization.k8s.iokind: Username: kubernetes EOFkubectl apply -f apiserver-to-kubelet-rbac.yaml 1234567891011121314151617181920212223242526272829303132333435363738 7、新增加Work Node 7.1 拷贝以部署好的相关文件到新节点 在Master节点将Work Node涉及文件拷贝到新节点 242.52/242.53 for i in {2..3}; do scp -r /opt/kubernetes root192.168.242.5$i:/opt/; donefor i in {2…3}; do scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service root192.168.242.5$i:/usr/lib/systemd/system; done for i in {2…3}; do scp -r /opt/kubernetes/ssl/ca.pem root192.168.242.5$i:/opt/kubernetes/ssl/; done 12345 7.2 删除kubelet证书和kubeconfig文件 rm -f /opt/kubernetes/cfg/kubelet.kubeconfig rm -f /opt/kubernetes/ssl/kubelet* 12 说明: 这几个文件是证书申请审批后自动生成的,每个Node不同,必须删除。 7.3 修改主机名 vi /opt/kubernetes/cfg/kubelet.conf --hostname-overridek8s-node1vi /opt/kubernetes/cfg/kube-proxy-config.yml hostnameOverride: k8s-node1 12345 7.4 启动并设置开机自启 systemctl daemon-reload systemctl start kubelet kube-proxy systemctl enable kubelet kube-proxy 123 7.5 在Master上同意新的Node kubelet证书申请 #查看证书请求 [rootk8s-master1 kubernetes]# kubectl get csr NAME AGE SIGNERNAME REQUESTOR CONDITION node-csr-2vKShQc_wlqPrTPAwT5MHpdRWIX-oyr9NyBXu1XNwxg 12s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending node-csr-KbHieprZUMOvTFMHGQ1RNTZEhsSlT5X6wsh2lzfUry4 47h kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued #同意 [rootk8s-master1 kubernetes]# kubectl certificate approve node-csr-2vKShQc_wlqPrTPAwT5MHpdRWIX-oyr9NyBXu1XNwxg certificatesigningrequest.certificates.k8s.io/node-csr-2vKShQc_wlqPrTPAwT5MHpdRWIX-oyr9NyBXu1XNwxg approved 12345678 7.6 查看Node状态(要稍等会才会变成ready,会下载一些初始化镜像) [rootk8s-master1 kubernetes]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master1 Ready none 46h v1.20.10 k8s-node1 Ready none 77s v1.20.10 1234 说明: 其他节点同上 8、部署Dashboard和CoreDNS 8.1 部署Dashboard kubectl apply -f kubernetes-dashboard.yaml#查看部署情况 [rootk8s-master1 yaml]# kubectl get pods,svc -n kubernetes-dashboard NAME READY STATUS RESTARTS AGE pod/dashboard-metrics-scraper-7b59f7d4df-k49t9 1/1 Running 0 10m pod/kubernetes-dashboard-74d688b6bc-l9jz4 1/1 Running 0 10m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/dashboard-metrics-scraper ClusterIP 10.0.0.206 none 8000/TCP 10m service/kubernetes-dashboard NodePort 10.0.0.10 none 443:30001/TCP 10m 123456789101112 访问地址: https://NodeIP:30001 创建service account并绑定默认cluster-admin管理员集群角色 kubectl create serviceaccount dashboard-admin -n kube-system kubectl create clusterrolebinding dashboard-admin --clusterrolecluster-admin --serviceaccountkube-system:dashboard-admin kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk /dashboard-admin/{print $1}) 123 使用输出的token登陆Dashboard(如访问提示https异常,可使用火狐浏览器) 8.2 部署CoreDNS CoreDNS主要用于集群内部Service名称解析。 [rootk8s-master1 yaml]# kubectl apply -f coredns.yaml [rootk8s-master1 yaml]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-97769f7c7-zcz5d 1/1 Running 1 47h calico-node-5tnll 1/1 Running 1 47h calico-node-m8sdg 1/1 Running 0 42m calico-node-pqvk9 1/1 Running 0 56m coredns-6cc56c94bd-5hvfb 1/1 Running 0 37s 123456789 测试解析是否正常 [rootk8s-master1 yaml]# kubectl run -it --rm dns-test --imagebusybox:1.28.4 sh If you dont see a command prompt, try pressing enter. / # ns nsenter nslookup / # nslookup kubernetes Server: 10.0.0.2 Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local 1234567 至此一个单Master的k8s节点就已经完成了 9、增加Master节点(高可用架构) 说明: Kubernetes作为容器集群系统通过健康检查重启策略实现了Pod故障自我修复能力通过调度算法实现将Pod分布式部署并保持预期副本数根据Node失效状态自动在其他Node拉起Pod实现了应用层的高可用性。 针对Kubernetes集群高可用性还应包含以下两个层面的考虑Etcd数据库的高可用性和Kubernetes Master组件的高可用性。 而Etcd我们已经采用3个节点组建集群实现高可用本节将对Master节点高可用进行说明和实施。 Master节点扮演着总控中心的角色通过不断与工作节点上的Kubelet和kube-proxy进行通信来维护整个集群的健康工作状态。如果Master节点故障将无法使用kubectl工具或者API做任何集群管理。 Master节点主要有三个服务kube-apiserver、kube-controller-manager和kube-scheduler其中kube-controller-manager和kube-scheduler组件自身通过选择机制已经实现了高可用所以Master高可用主要针对kube-apiserver组件而该组件是以HTTP API提供服务因此对他高可用与Web服务器类似增加负载均衡器对其负载均衡即可并且可水平扩容。 多Master架构图 9.1 部署Master2 Node 说明 现在需要再增加一台新服务器作为Master2 NodeIP是192.168.242.54。 Master2 与已部署的Master1所有操作一致。所以我们只需将Master1所有K8s文件拷贝过来再修改下服务器IP和主机名启动即可。 9.1.1 安装Docker(Master1) scp /usr/bin/docker* root192.168.242.54:/usr/bin scp /usr/bin/runc root192.168.242.54:/usr/bin scp /usr/bin/containerd* root192.168.242.54:/usr/bin scp /usr/lib/systemd/system/docker.service root192.168.242.54:/usr/lib/systemd/system scp -r /etc/docker root192.168.242.54:/etc 12345 9.1.2 启动Docker、设置开机自启(Master2) systemctl daemon-reload systemctl start docker systemctl enable docker 123 9.1.3 创建etcd证书目录(Master2) mkdir -p /opt/etcd/ssl 1 9.1.4 拷贝文件(Master1) 拷贝Master1上所有k8s文件和etcd证书到Master2: scp -r /opt/kubernetes root192.168.242.54:/opt scp -r /opt/etcd/ssl root192.168.242.54:/opt/etcd scp /usr/lib/systemd/system/kube* root192.168.242.54:/usr/lib/systemd/system scp /usr/bin/kubectl root192.168.242.54:/usr/bin scp -r ~/.kube root192.168.242.54:~ 12345 9.1.5 删除证书(Master2) 删除kubelet和kubeconfig文件 rm -f /opt/kubernetes/cfg/kubelet.kubeconfig rm -f /opt/kubernetes/ssl/kubelet* 12 9.1.6 修改配置文件和主机名(Master2) 修改apiserver、kubelet和kube-proxy配置文件为本地IP vi /opt/kubernetes/cfg/kube-apiserver.conf ... --bind-address192.168.242.54 \ --advertise-address192.168.242.54 \ ...vi /opt/kubernetes/cfg/kube-controller-manager.kubeconfig server: https://192.168.242.54:6443 vi /opt/kubernetes/cfg/kube-scheduler.kubeconfig server: https://192.168.242.54:6443 vi /opt/kubernetes/cfg/kubelet.conf –hostname-overridek8s-master2 vi /opt/kubernetes/cfg/kube-proxy-config.yml hostnameOverride: k8s-master2 vi ~/.kube/config … server: https://192.168.242.54:6443 123456789101112131415161718192021 9.1.7 启动并设置开机自启(Master2) systemctl daemon-reload systemctl start kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy systemctl enable kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy 123 9.1.7 查看集群状态(Master2) kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-1 Healthy {health:true} etcd-2 Healthy {health:true} etcd-0 Healthy {health:true} 1234567 9.1.8 审批kubelet证书申请 # 查看证书请求 [rootk8s-master1 ~]# kubectl get csr NAME AGE SIGNERNAME REQUESTOR CONDITION node-csr-EQoVFfTbo6DcvcWfaRzBbMst4BXmdyds99DEYk2oDDE 33m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending同意请求 kubectl certificate approve node-csr-EQoVFfTbo6DcvcWfaRzBbMst4BXmdyds99DEYk2oDDEcertificatesigningrequest.certificates.k8s.io/node-csr-EQoVFfTbo6DcvcWfaRzBbMst4BXmdyds99DEYk2oDDE approved 查看Node [rootk8s-master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master1 Ready none 6d23h v1.20.10 k8s-master2 Ready none 9m11s v1.20.10 k8s-node1 Ready none 5d v1.20.10 k8s-node2 Ready none 5d v1.20.10 123456789101112131415 至此一个双Master节点k8s集群已经部署完毕 9.2 部署NginxKeepalived高可用负载均衡器 Nginx是一个主流Web服务和反向代理服务器这里用四层实现对apiserver实现负载均衡。Keepalived是一个主流高可用软件基于VIP绑定实现服务器双机热备在上述拓扑中Keepalived主要根据Nginx运行状态判断是否需要故障转移漂移VIP例如当Nginx主节点挂掉VIP会自动绑定在Nginx备节点从而保证VIP一直可用实现Nginx高可用。如果你是在公有云上一般都不支持keepalived那么你可以直接用它们的负载均衡器产品直接负载均衡多台Master kube-apiserver架构与上面一样。 在两台Master节点操作。 9.2.1 安装软件包(Master1/Master2) yum install epel-release -y yum install nginx keepalived -y 12 9.2.2 Nginx配置文件(主备相同) cat /etc/nginx/nginx.conf EOF user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid;include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } 四层负载均衡为两台Master apiserver组件提供负载均衡 stream { log_format main $remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent;access_log /var/log/nginx/k8s-access.log main;upstream k8s-apiserver {server 192.168.242.51:6443; # Master1 APISERVER IP:PORTserver 192.168.242.54:6443; # Master2 APISERVER IP:PORT }server {listen 16443; # 由于nginx与master节点复用这个监听端口不能是6443否则会冲突proxy_pass k8s-apiserver; }} http { log_format main $remote_addr - remoteuser[remote_user [remoteu​ser[time_local] “KaTeX parse error: Double superscript at position 34: … ̲status bodybytessentbody_bytes_sent bodyb​ytess​enthttp_referer” ’ ‘“httpuseragenthttp_user_agent httpu​sera​genthttp_x_forwarded_for”’; access_log /var/log/nginx/access.log main;sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048;include /etc/nginx/mime.types; default_type application/octet-stream;server {listen 80 default_server;server_name _;location / {} }} EOF 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 9.2.3 keepalived配置文件(Master1) cat /etc/keepalived/keepalived.conf EOF global_defs { notification_email { acassenfirewall.loc failoverfirewall.loc sysadminfirewall.loc } notification_email_from Alexandre.Cassenfirewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id NGINX_MASTER } vrrp_script check_nginx { script “/etc/keepalived/check_nginx.sh” } vrrp_instance VI_1 { state MASTER interface ens33 # 修改为实际网卡名 virtual_router_id 51 # VRRP 路由 ID实例每个实例是唯一的 priority 100 # 优先级备服务器设置 90 advert_int 1 # 指定VRRP 心跳包通告间隔时间默认1秒 authentication { auth_type PASS auth_pass 1111 } # 虚拟IP virtual_ipaddress { 192.168.242.55/24 } track_script { check_nginx } } EOF 123456789101112131415161718192021222324252627282930313233343536 vrrp_script指定检查nginx工作状态脚本根据nginx状态判断是否故障转移virtual_ipaddress虚拟IPVIP 准备上述配置文件中检查Nginx运行状态的脚本 cat /etc/keepalived/check_nginx.sh EOF #!/bin/bash count$(ss -antp |grep 16443 |egrep -cv grep|$$)if [ “$count” -eq 0 ];then exit 1 else exit 0 fi EOF chmod x /etc/keepalived/check_nginx.sh 1234567891011 9.2.4 keepalived配置(master2) cat /etc/keepalived/keepalived.conf EOF global_defs { notification_email { acassenfirewall.loc failoverfirewall.loc sysadminfirewall.loc } notification_email_from Alexandre.Cassenfirewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id NGINX_BACKUP } vrrp_script check_nginx { script “/etc/keepalived/check_nginx.sh” } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 # VRRP 路由 ID实例每个实例是唯一的 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.242.55/24 } track_script { check_nginx } } EOF 1234567891011121314151617181920212223242526272829303132333435 准备上述配置文件中检查nginx运行状态的脚本 cat /etc/keepalived/check_nginx.sh EOF #!/bin/bash count$(ss -antp |grep 16443 |egrep -cv grep|$$)if [ “$count” -eq 0 ];then exit 1 else exit 0 fi EOF chmod x /etc/keepalived/check_nginx.sh 123456789101112 说明 keepalived根据脚本返回状态码0为工作正常非0不正常判断是否故障转移。 9.2.5 Nginx增加Steam模块 9.2.5.1 查看Nginx版本模块 如果已经安装 --with-stream模块,后面的步骤可以跳过 [rootk8s-master2 nginx-1.20.1]# nginx -V nginx version: nginx/1.20.1 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) configure arguments: --prefix/usr/share/nginx --sbin-path/usr/sbin/nginx --modules-path/usr/lib64/nginx/modules --conf-path/etc/nginx/nginx.conf --with-stream 1234 9.2.5.2 下载同一个版本的nginx 下载地址 : http://nginx.org/download/ 1 9.2.5.3 备份原Nginx文件 mv /usr/sbin/nginx /usr/sbin/nginx.bak cp -r /etc/nginx{,.bak} 12 9.2.5.3 重新编译Nginx 检查模块是否支持比如这次添加 limit 限流模块 和 stream 模块 ./configure –help | grep limitps-without-http_limit_conn_module disable 表示已有该模块编译时不需要添加 ./configure –help | grep stream ps–with-stream enable 表示不支持编译时要自己添加该模块 根据第1步查到已有的模块加上本次需新增的模块: --with-stream 12345678910 编译环境准备 yum -y install libxml2 libxml2-dev libxslt-devel yum -y install gd-devel yum -y install perl-devel perl-ExtUtils-Embed yum -y install GeoIP GeoIP-devel GeoIP-data yum -y install pcre-devel yum -y install openssl openssl-devel yum -y install gcc make 1234567 编译 tar -xf nginx-1.20.1.tar.gz cd nginx-1.20.1/ ./configure --prefix/usr/share/nginx --sbin-path/usr/sbin/nginx --modules-path/usr/lib64/nginx/modules --conf-path/etc/nginx/nginx.conf --with-stream make 1234 说明: make完成后不要继续输入“make install”以免现在的nginx出现问题 以上完成后会在objs目录下生成一个nginx文件先验证: [rootk8s-master2 nginx-1.20.1]# ./objs/nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful 123 9.2.5.4 替换nginx到Master1/Master2 cp ./objs/nginx /usr/sbin/ scp objs/nginx root192.168.242.51:/usr/sbin/ 12 9.2.5.5 修改nginx服务文件 vim /usr/lib/systemd/system/nginx.service [Unit] DescriptionThe nginx HTTP and reverse proxy server Afternetwork.target remote-fs.target nss-lookup.target [Service] Typeforking PIDFile/run/nginx.pid ExecStartPre/usr/bin/rm -rf /run/nginx.pid ExecStartPre/usr/sbin/nginx -t ExecStart/usr/sbin/nginx ExecStop/usr/sbin/nginx -s stop ExecReload/usr/sbin/nginx -s reload PrivateTmptrue [Install] WantedBymulti-user.target 123456789101112131415 9.2.6 启动并设置开机自启(master1/master2) systemctl daemon-reload systemctl start nginx keepalived systemctl enable nginx keepalived 123 9.2.7 查看keepalived工作状态 [rootk8s-master1 ~]# ip addr 1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:40:1a:d8 brd ff:ff:ff:ff:ff:ffinet 192.168.242.51/24 brd 192.168.242.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.242.55/24 scope global secondary ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe40:1ad8/64 scope link valid_lft forever preferred_lft forever 3: docker0: NO-CARRIER,BROADCAST,MULTICAST,UP mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:f3:e1:d2:e6 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever 4: tunl0NONE: NOARP,UP,LOWER_UP mtu 1440 qdisc noqueue state UNKNOWN group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0inet 10.244.159.128/32 brd 10.244.159.128 scope global tunl0valid_lft forever preferred_lft forever 5: calia231fca418bif4: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1440 qdisc noqueue state UP group default link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 0inet6 fe80::ecee:eeff:feee:eeee/64 scope lin 1234567891011121314151617181920212223242526 可以看到在ens33网卡绑定了192.168.242.55 虚拟IP说明工作正常。 9.2.8 Nginxkeepalived高可用测试 关闭主节点Nginx测试VIP是否漂移到备节点服务器。 在Nginx Master执行 pkill nginx; 在Nginx Backupip addr命令查看已成功绑定VIP。 9.2.9 访问负载均衡器测试 找K8s集群中任意一个节点使用curl查看K8s版本测试使用VIP访问 [rootk8s-master1 ~]# curl -k https://192.168.242.55:16443/version {major: 1,minor: 20,gitVersion: v1.20.10,gitCommit: 8152330a2b6ca3621196e62966ef761b8f5a61bb,gitTreeState: clean,buildDate: 2021-08-11T18:00:37Z,goVersion: go1.15.15,compiler: gc,platform: linux/amd64 }[rootk8s-master1 ~]# curl -k https://192.168.242.55:16443/version ^[[A{major: 1,minor: 20,gitVersion: v1.20.10,gitCommit: 8152330a2b6ca3621196e62966ef761b8f5a61bb,gitTreeState: clean,buildDate: 2021-08-11T18:00:37Z,goVersion: go1.15.15,compiler: gc,platform: linux/amd64 }[rootk8s-master1 ~]# curl -k https://192.168.242.55:16443/version {major: 1,minor: 20,gitVersion: v1.20.10,gitCommit: 8152330a2b6ca3621196e62966ef761b8f5a61bb,gitTreeState: clean,buildDate: 2021-08-11T18:00:37Z,goVersion: go1.15.15,compiler: gc,platform: linux/amd64 }[rootk8s-master1 ~]# curl -k https://192.168.242.55:16443/version {major: 1,minor: 20,gitVersion: v1.20.10,gitCommit: 8152330a2b6ca3621196e62966ef761b8f5a61bb,gitTreeState: clean,buildDate: 2021-08-11T18:00:37Z,goVersion: go1.15.15,compiler: gc,platform: linux/amd64 1234567891011121314151617181920212223242526272829303132333435363738394041424344 可以正确获取到K8s版本信息说明负载均衡器搭建正常。该请求数据流程curl - vip(nginx) - apiserver 通过查看Nginx日志也可以看到转发apiserver IP [rootk8s-master1 ~]# tailf /var/log/nginx/k8s-access.log 192.168.242.51 192.168.242.51:6443 - [14/Sep/2021:23:53:07 0800] 200 424 192.168.242.51 192.168.242.54:6443 - [14/Sep/2021:23:53:09 0800] 200 424 192.168.242.51 192.168.242.51:6443 - [14/Sep/2021:23:53:10 0800] 200 424 192.168.242.51 192.168.242.54:6443 - [14/Sep/2021:23:53:11 0800] 200 424 12345 9.3 修改所有的Work Node连接LB VIP 试想下虽然我们增加了Master2 Node和负载均衡器但是我们是从单Master架构扩容的也就是说目前所有的Worker Node组件连接都还是Master1 Node如果不改为连接VIP走负载均衡器那么Master还是单点故障。 因此接下来就是要改所有Worker Nodekubectl get node命令查看到的节点组件配置文件由原来192.168.242.51修改为192.168.242.55VIP。 在所有Worker Node执行 sed -i s#192.168.242.51:6443#192.168.242.55:16443# /opt/kubernetes/cfg/* systemctl restart kubelet kube-proxy 12 检查节点状态 [rootk8s-master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master1 Ready none 7d v1.20.10 k8s-master2 Ready none 90m v1.20.10 k8s-node1 Ready none 5d1h v1.20.10 k8s-node2 Ready none 5d1h v1.20.10 123456 至此,一套高可用的k8s二进制可用集群就部署完成了~ 三、部署常见问题 1、系统断电后,某个etcd节点无法启动 1.1 报错信息 publish error: etcdserver: request timed out 1 1.2 解决方法(如果没有重要数据,或者刚进行完初始化) 检查日志发现并没有特别明显的错误根据经验来讲etcd 节点坏掉一个其实对集群没有大的影响这时集群已经可以正常使用了但是这个坏掉的 etcd 节点并没有启动 #进入 etcd 的数据存储目录进行备份 备份原有数据 cd /var/lib/etcd/default.etcd/member/ cp * /data/bak/ #删除这个目录下的所有数据文件 rm -rf /var/lib/etcd/default.etcd/member/* #停止另外两台 etcd 节点因为 etcd 节点启动时需要所有节点一起启动启动成功后即可使用。 systemctl stop etcd systemctl restart etcd 12345678
http://www.hkea.cn/news/14293895/

相关文章:

  • 大气黑色女性时尚类网站织梦模板杨浦建设机械网站
  • 如何有效的进行网站策划医院做网站需要多少钱
  • 怎么制作网站教程wordpress 联动筛选
  • 建行官方网站 - 百度公司网站建设项目目的
  • 国外设计师灵感网站wordpress和vue
  • 网站开发 前台代码pythonunicode转码
  • 上海史特网站建设网页游戏手机
  • 东莞 企业网站建设国内做网站哪个好
  • 松江网站设计广东网站建设怎么选
  • 屏蔽网页 的网站备案网站快速收录方法
  • 网站公司做的网站有最字网站建设模板
  • 灰色项目网站代做什么叫子网站
  • 创业网站建设政策wordpress加跳转
  • 广州网站设计后缀淘宝店铺运营推广
  • 如果使用自己电脑做网站网站被k后是怎样的
  • 搭建简单的网站免费人才招聘网站
  • 经营性质的网站怎样把已经有的网站做推广
  • 网站源码建站关键词排名技巧
  • 网站搭建的步骤成都网站快速排名
  • 网站查询入口做电脑回收什么网站好
  • 仿百度百科网站源码短视频营销的优势有哪些
  • 外国域名注册网站wordpress轮播的插件
  • 如何能把网站做的更大南宫28在线注册网站
  • 网站建设中界面模板简单的个人网站制作流程
  • 怎么验证网站备案密码是否正确个人怎么建设图书网站
  • 网站描述和关键词怎么写安徽建设厅网站网址
  • html手机网站开发教程电商网站平台建设资金预算
  • 成都户外网站建设招聘网站哪个好用
  • 网站开发资金预算wordpress文章数据包
  • wordpress 企业站模板个人网站建设模板