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

装饰设计网站模板北京公司注册网址

装饰设计网站模板,北京公司注册网址,安徽六安职业技术学院,广州新塘排名seo优化公司文章目录 1. 常见的K8S安装部署方式1.1 Minikube1.2 Kubeadm1.3 二进制安装部署 2. Kubernetes单master集群架构 ---- #xff08;二进制安装部署#xff09;2.1 前置准备2.2 操作系统初始化2.3 部署 docker引擎 ---- #xff08;所有 node 节点#xff09;2.4 部署 etcd 集… 文章目录 1. 常见的K8S安装部署方式1.1 Minikube1.2 Kubeadm1.3 二进制安装部署 2. Kubernetes单master集群架构 ---- 二进制安装部署2.1 前置准备2.2 操作系统初始化2.3 部署 docker引擎 ---- 所有 node 节点2.4 部署 etcd 集群2.4.1 etcd的特点2.4.2 准备签发证书环境2.4.3 在 master01 节点上操作2.4.4 在 node01 节点上操作2.4.5 在 node02 节点上操作 2.5 部署 Master 组件2.5.1 在 master01 节点上操作 2.6 部署 Worker Node 组件2.6.1 在所有 node 节点上操作2.6.1.1 node01部署2.6.1.2 node02 节点部署 1. 常见的K8S安装部署方式 1.1 Minikube Minikube是一个工具可以在本地快速运行一个单节点微型K8S仅用于学习、预览K8S的一些特性使用。 部署地址https://kubernetes.io/docs/setup/minikube1.2 Kubeadm Kubeadm也是一个工具提供kubeadm init和kubeadm join用于快速部署K8S集群相对简单。 https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/1.3 二进制安装部署 生产首选从官方下载发行版的二进制包手动部署每个组件和自签TLS证书组成K8S集群新手推荐。 https://github.com/kubernetes/kubernetes/releases2. Kubernetes单master集群架构 ---- 二进制安装部署 2.1 前置准备 master01 192.168.67.102node01 192.168.67.103 node02 192.168.67.1042.2 操作系统初始化 #关闭防火墙 systemctl stop firewalld systemctl disable firewalld iptables -F iptables -t nat -F iptables -t mangle -F iptables -X#关闭selinux setenforce 0 sed -i s/enforcing/disabled/ /etc/selinux/config#关闭swap swapoff -a sed -ri s/.*swap.*/#/ /etc/fstab #根据规划设置主机名 hostnamectl set-hostname master01 hostnamectl set-hostname node01 hostnamectl set-hostname node02#添加hosts cat /etc/hosts EOF 192.168.67.102 master01 192.168.67.103 node01 192.168.67.104 node02 EOF#调整内核参数 cat /etc/sysctl.d/k8s.conf EOF net.bridge.bridge-nf-call-ip6tables 1 #开启网桥模式可将网桥的流量传递给iptables链 net.bridge.bridge-nf-call-iptables 1 net.ipv6.conf.all.disable_ipv61 #关闭ipv6协议 net.ipv4.ip_forward1 EOFsysctl --system #全局加载yum install ntpdate -y ntpdate time.windows.com #与windows进行时间同步2.3 部署 docker引擎 ---- 所有 node 节点 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io#创建配置文件 mkdir /etc/dockervim /etc/docker/daemon.json {registry-mirrors: [https://r5uulkvq.mirror.aliyuncs.com],exec-opts: [native.cgroupdriversystemd],log-driver: json-file,log-opts: {max-size: 500m, max-file: 3} }使用Systemd管理的Cgroup来进行资源控制与管理因为相对Cgroupfs而言Systemd限制CPU、内存等资源更加简单和成熟稳定。 #日志使用json-file格式类型存储大小为100M保存在/var/log/containers目录下方便ELK等日志系统收集和管理日志。systemctl start docker.service systemctl enable docker.service 2.4 部署 etcd 集群 使用cfssl工具签发证书和私钥解压etcd软件包获取二进制文件 etcd etcdctl准备etcd集群配置文件启动etcd服务进程加入到etcd集群 2.4.1 etcd的特点 etcd 作为服务发现系统有以下的特点 简单安装配置简单而且提供了HTTP API进行交互使用也很简单安全支持SSL证书验证快速单实例支持每秒2k读操作可靠采用raft算法实现分布式系统数据的可用性和一致性 etcd 目前默认使用2379端口提供HTTP API服务 2380端口和peer通信(这两个端口已经被IANA(互联网数字分配机构)官方预留给etcd)。 即etcd默认使用2379端口对外为客户端提供通讯使用端口2380来进行服务器间内部通讯。etcd 在生产环境中一般推荐集群方式部署。由于etcd 的leader选举机制要求至少为3台或以上的奇数台。2.4.2 准备签发证书环境 CFSSL 是 CloudFlare 公司开源的一款 PKI/TLS 工具。 CFSSL 包含一个命令行工具和一个用于签名、验证和捆绑 TLS 证书的 HTTP API 服务。使用Go语言编写。CFSSL 使用配置文件生成证书因此自签之前需要生成它识别的 json 格式的配置文件CFSSL 提供了方便的命令行生成配置文件。CFSSL 用来为 etcd 提供 TLS 证书它支持签三种类型的证书 1、client 证书服务端连接客户端时携带的证书用于客户端验证服务端身份如 kube-apiserver 访问 etcd 2、server 证书客户端连接服务端时携带的证书用于服务端验证客户端身份如 etcd 对外提供服务 3、peer 证书相互之间连接时使用的证书如 etcd 节点之间进行验证和通信。 这里全部都使用同一套证书认证。2.4.3 在 master01 节点上操作 ### 生成Etcd证书 ### mkdir /opt/k8s #创建工作目录cd /opt/k8s #创建配置文件脚本 vim etcd.sh#!/bin/bash #example: ./etcd.sh etcd01 192.168.67.102 etcd02https://192.168.67.103:2380,etcd03https://192.168.67.104:2380#创建etcd配置文件/opt/etcd/cfg/etcd ETCD_NAME$1 ETCD_IP$2 ETCD_CLUSTER$3WORK_DIR/opt/etcdcat $WORK_DIR/cfg/etcd EOF #[Member] ETCD_NAME${ETCD_NAME} ETCD_DATA_DIR/var/lib/etcd/default.etcd ETCD_LISTEN_PEER_URLShttps://${ETCD_IP}:2380 ETCD_LISTEN_CLIENT_URLShttps://${ETCD_IP}:2379#[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLShttps://${ETCD_IP}:2380 ETCD_ADVERTISE_CLIENT_URLShttps://${ETCD_IP}:2379 ETCD_INITIAL_CLUSTERetcd01https://${ETCD_IP}:2380,${ETCD_CLUSTER} ETCD_INITIAL_CLUSTER_TOKENetcd-cluster ETCD_INITIAL_CLUSTER_STATEnew EOF#Member:成员配置 #ETCD_NAME节点名称集群中唯一。成员名字集群中必须具备唯一性如etcd01 #ETCD_DATA_DIR数据目录。指定节点的数据存储目录这些数据包括节点ID集群ID集群初始化配置Snapshot文件若未指定-wal-dir还会存储WAL文件如果不指定会用缺省目录 #ETCD_LISTEN_PEER_URLS集群通信监听地址。用于监听其他member发送信息的地址。ip为全0代表监听本机所有接口 #ETCD_LISTEN_CLIENT_URLS客户端访问监听地址。用于监听etcd客户发送信息的地址。ip为全0代表监听本机所有接口#Clustering集群配置 #ETCD_INITIAL_ADVERTISE_PEER_URLS集群通告地址。其他member使用其他member通过该地址与本member交互信息。一定要保证从其他member能可访问该地址。静态配置方式下该参数的value一定要同时在--initial-cluster参数中存在 #ETCD_ADVERTISE_CLIENT_URLS客户端通告地址。etcd客户端使用客户端通过该地址与本member交互信息。一定要保证从客户侧能可访问该地址 #ETCD_INITIAL_CLUSTER集群节点地址。本member使用。描述集群中所有节点的信息本member根据此信息去联系其他member #ETCD_INITIAL_CLUSTER_TOKEN集群Token。用于区分不同集群。本地如有多个集群要设为不同 #ETCD_INITIAL_CLUSTER_STATE加入集群的当前状态new是新集群existing表示加入已有集群。#创建etcd.service服务管理文件 cat /usr/lib/systemd/system/etcd.service EOF [Unit] DescriptionEtcd Server Afternetwork.target Afternetwork-online.target Wantsnetwork-online.target[Service] Typenotify EnvironmentFile${WORK_DIR}/cfg/etcd ExecStart${WORK_DIR}/bin/etcd \ --cert-file${WORK_DIR}/ssl/server.pem \ --key-file${WORK_DIR}/ssl/server-key.pem \ --trusted-ca-file${WORK_DIR}/ssl/ca.pem \ --peer-cert-file${WORK_DIR}/ssl/server.pem \ --peer-key-file${WORK_DIR}/ssl/server-key.pem \ --peer-trusted-ca-file${WORK_DIR}/ssl/ca.pem \ --loggerzap \ --enable-v2 Restarton-failure LimitNOFILE65536[Install] WantedBymulti-user.target EOF#--enable-v2开启 etcd v2 API 接口。当前 flannel 版本不支持 etcd v3 通信 #--loggerzap使用 zap 日志框架。zap.Logger 是go语言中相对日志库中性能最高的 #--peer开头的配置项用于指定集群内部TLS相关证书peer 证书这里全部都使用同一套证书认证 #不带--peer开头的的参数是指定 etcd 服务器TLS相关证书server 证书这里全部都使用同一套证书认证systemctl daemon-reload systemctl enable etcd systemctl restart etcd#创建CA证书脚本 vim etcd-cert.sh#!/bin/bash #配置证书生成策略让 CA 软件知道颁发有什么功能的证书生成用来签发其他组件证书的根证书 cat ca-config.json EOF {signing: {default: {expiry: 87600h},profiles: {www: {expiry: 87600h,usages: [signing,key encipherment,server auth,client auth]}}} } EOF#ca-config.json可以定义多个 profiles分别指定不同的过期时间、使用场景等参数 #后续在签名证书时会使用某个 profile此实例只有一个 www 模板。 #expiry指定了证书的有效期87600h 为10年如果用默认值一年的话证书到期后集群会立即宕掉 #signing表示该证书可用于签名其它证书生成的 ca.pem 证书中 CATRUE #key encipherment表示使用非对称密钥加密如 RSA 加密 #server auth表示client可以用该 CA 对 server 提供的证书进行验证 #client auth表示server可以用该 CA 对 client 提供的证书进行验证 #注意标点符号最后一个字段一般是没有逗号的。#----------------------- #生成CA证书和私钥根证书和私钥 #特别说明 cfssl和openssl有一些区别openssl需要先生成私钥然后用私钥生成请求文件最后生成签名的证书和私钥等但是cfssl可以直接得到请求文件。 cat ca-csr.json EOF {CN: etcd,key: {algo: rsa,size: 2048},names: [{C: CN,L: Beijing,ST: Beijing}] } EOF#CNCommon Name浏览器使用该字段验证网站或机构是否合法一般写的是域名 #key指定了加密算法一般使用rsasize2048 #CCountry国家 #STState州省 #LLocality地区,城市 #O: Organization Name组织名称公司名称 #OU: Organization Unit Name组织单位名称公司部门cfssl gencert -initca ca-csr.json | cfssljson -bare ca#生成的文件 #ca-key.pem根证书私钥 #ca.pem根证书 #ca.csr根证书签发请求文件#cfssl gencert -initca CSRJSON使用 CSRJSON 文件生成新的证书和私钥。如果不添加管道符号会直接把所有证书内容输出到屏幕。 #注意CSRJSON 文件用的是相对路径所以 cfssl 的时候需要 csr 文件的路径下执行也可以指定为绝对路径。 #cfssljson 将 cfssl 生成的证书json格式变为文件承载式证书-bare 用于命名生成的证书文件。#----------------------- #生成 etcd 服务器证书和私钥 cat server-csr.json EOF {CN: etcd,hosts: [192.168.67.102,192.168.67.103,192.168.67.104],key: {algo: rsa,size: 2048},names: [{C: CN,L: BeiJing,ST: BeiJing}] } EOF#hosts将所有 etcd 集群节点添加到 host 列表需要指定所有 etcd 集群的节点 ip 或主机名不能使用网段新增 etcd 服务器需要重新签发证书。cfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilewww server-csr.json | cfssljson -bare server#生成的文件 #server.csr服务器的证书请求文件 #server-key.pem服务器的私钥 #server.pem服务器的数字签名证书#-config引用证书生成策略文件 ca-config.json #-profile指定证书生成策略文件中的的使用场景比如 ca-config.json 中的 wwwchmod x etcd-cert.sh etcd.sh #添加执行权限cfssl证书签发的工具命令 cfssljson将 cfssl 生成的证书json格式变为文件承载式证书 cfssl-certinfo验证证书的信息 cfssl-certinfo -cert 证书名称 #查看证书的信息cd /usr/local/bin#准备cfssl证书生成工具 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfochmod x /usr/local/bin/cfssl* #添加执行权限#创建用于生成CA证书、etcd 服务器证书以及私钥的目录 mkdir /opt/k8s/etcd-cert mv etcd-cert.sh etcd-cert/ cd /opt/k8s/etcd-cert/./etcd-cert.sh #生成CA证书、etcd 服务器证书以及私钥ca.pem :CA证书 ca.key.pem:CA的私钥文件server.pem:服务端证书 server-key.pem服务端私钥文件#上传 etcd-v3.4.26-linux-amd64.tar.gz 到 /opt/k8s 目录中启动etcd服务 cd /opt/k8s/ tar xf etcd-v3.4.26-linux-amd64.tar.gz #解压缩软件包#创建用于存放 etcd 配置文件命令文件证书的目录 mkdir -p /opt/etcd/{cfg,bin,ssl}cd /opt/k8s/etcd-v3.4.26-linux-amd64/ mv etcd etcdctl /opt/etcd/bin/ cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/cd /opt/k8s/./etcd.sh etcd01 192.168.67.102 etcd02https://192.168.67.103:2380,etcd03https://192.168.67.104:2380 #进入卡住状态等待其他节点加入这里需要三台etcd服务同时启动如果只启动其中一台后服务会卡在那里直到集群中所有etcd节点都已启动可忽略这个情况#可另外打开一个窗口查看etcd进程是否正常 ps -ef | grep etcd#把etcd相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点 scp -r /opt/etcd/ root192.168.67.103:/opt/ scp -r /opt/etcd/ root192.168.67.104:/opt/scp /usr/lib/systemd/system/etcd.service root192.168.67.103:/usr/lib/systemd/system/ scp /usr/lib/systemd/system/etcd.service root192.168.67.104:/usr/lib/systemd/system/2.4.4 在 node01 节点上操作 vim /opt/etcd/cfg/etcd#[Member] ETCD_NAMEetcd02 #修改 ETCD_DATA_DIR/var/lib/etcd/default.etcd ETCD_LISTEN_PEER_URLShttps://192.168.67.103:2380 #修改 ETCD_LISTEN_CLIENT_URLShttps://192.168.67.103:2379 #修改#[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLShttps://192.168.67.103:2380 #修改 ETCD_ADVERTISE_CLIENT_URLShttps://192.168.67.103:2379 #修改 ETCD_INITIAL_CLUSTERetcd01https://192.168.67.102:2380,etcd02https://192.168.67.103:2380,etcd03https://192.168.67.104:2380 ETCD_INITIAL_CLUSTER_TOKENetcd-cluster ETCD_INITIAL_CLUSTER_STATEnew#启动etcd服务 systemctl start etcd systemctl enable etcd systemctl status etcd2.4.5 在 node02 节点上操作 vim /opt/etcd/cfg/etcd #[Member] ETCD_NAMEetcd03 #修改 ETCD_DATA_DIR/var/lib/etcd/default.etcd ETCD_LISTEN_PEER_URLShttps://192.168.67.104:2380 #修改 ETCD_LISTEN_CLIENT_URLShttps://192.168.67.104:2379 #修改#[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLShttps://192.168.67.104:2380 #修改 ETCD_ADVERTISE_CLIENT_URLShttps://192.168.67.104:2379 #修改 ETCD_INITIAL_CLUSTERetcd01https://192.168.67.102:2380,etcd02https://192.168.67.103:2380,etcd03https://192.168.67.104:2380 ETCD_INITIAL_CLUSTER_TOKENetcd-cluster ETCD_INITIAL_CLUSTER_STATEnew#启动etcd服务 systemctl start etcd systemctl enable etcd systemctl status etcd#检查etcd群集状态 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.67.102:2379,https://192.168.67.103:2379,https://192.168.67.104:2379 endpoint health --write-outtable------------------------------------------------------------------------------------------ --cert-file识别HTTPS端使用SSL证书文件 --key-file使用此SSL密钥文件标识HTTPS客户端 --ca-file使用此CA证书验证启用https的服务器的证书 --endpoints集群中以逗号分隔的机器地址列表 --cluster-health检查etcd集群的运行状况 ------------------------------------------------------------------------------------------#查看etcd集群成员列表 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.67.102:2379,https://192.168.67.103:2379,https://192.168.67.104:2379 --write-outtable member list#相关管理命令格式#查看etcd集群健康状态 ETCDCTL_API3 /opt/etcd/bin/etcdctl --endpointshttps://etcd01IP:2379,https://etcd02IP:2379,https://etcd03IP:2379 --cacertCA证书 --cert服务端证书 --key服务端私钥 endpoint health -wtable#查看etcd集群状态信息 ETCDCTL_API3 /opt/etcd/bin/etcdctl --endpointshttps://etcd01IP:2379,https://etcd02IP:2379,https://etcd03IP:2379 --cacertCA证书 --cert服务端证书 --key服务端私钥 endpoint status -wtable#查看etcd集群成员列表 ETCDCTL_API3 /opt/etcd/bin/etcdctl --endpointshttps://etcd01IP:2379 --cacertCA证书 --cert服务端证书 --key服务端私钥 member list -wtable #备份etcd数据库 ETCDCTL_API3 /opt/etcd/bin/etcdctl --endpointshttps://etcd01IP:2379 --cacertCA证书 --cert服务端证书 --key服务端私钥 snapshot save 备份文件路径#恢复etcd数据库 ETCDCTL_API3 /opt/etcd/bin/etcdctl --endpointshttps://etcd01IP:2379 --cacertCA证书 --cert服务端证书 --key服务端私钥 snapshot restore 文件路径#查看备份文件的状态信息 ETCDCTL_API3 /opt/etcd/bin/etcdctl --endpointshttps://etcd01IP:2379 --cacertCA证书 --cert服务端证书 --key服务端私钥 snapshot status 文件路径 2.5 部署 Master 组件 使用cfssl工具签发证书和私钥解压K8S服务端软件包获取二进制文件 kube-apiserver kube-controller-manager kube-scheduler kubect准备 kube-apiserver 启动时要调用的 bootstrap-token 认证文件准备 kube-apiserver kube-controller-manager kube-scheduler 的服务进程启动参数配置文件准备 kube-controller-manager kube-scheduler kubectl 的 kubeconfig 集群引导配置文件加入K8S集群的引导文件依次启动 kube-apiserver kube-controller-manager kube-scheduler 的服务进程执行 kubectl get cs 命令查看master组件的健康状态 2.5.1 在 master01 节点上操作 #上传 master.zip 到 /opt/k8s 目录中解压 master.zip 压缩包 cd /opt/k8s/ unzip master.zip chmod x *.sh#创建kubernetes工作目录 mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}#创建用于生成CA证书、相关组件的证书和私钥的目录 mkdir /opt/k8s/k8s-cert mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert cd /opt/k8s/k8s-cert/vim k8s-cert.sh #!/bin/bash #配置证书生成策略让 CA 软件知道颁发有什么功能的证书生成用来签发其他组件证书的根证书 cat ca-config.json EOF {signing: {default: {expiry: 87600h },profiles: {kubernetes: {expiry: 87600h, #证书的有效时间usages: [ #使用场景signing, #签发证书key encipherment, #密钥server auth, #服务端事务client auth #客户端事务]}}} } EOF#生成CA证书和私钥根证书和私钥 cat ca-csr.json EOF {CN: kubernetes,key: {algo: rsa,size: 2048},names: [{C: CN,L: Beijing,ST: Beijing,O: k8s,OU: System}] } EOFcfssl gencert -initca ca-csr.json | cfssljson -bare ca -#----------------------- #生成 apiserver 的证书和私钥apiserver和其它k8s组件通信使用 #hosts中将所有可能作为 apiserver 的 ip 添加进去后面 keepalived 使用的 VIP 也要加入 cat apiserver-csr.json EOF {CN: kubernetes,hosts: [10.0.0.1,127.0.0.1,192.168.67.102, #master01192.168.67.105, #master02192.168.67.200, #vip后面 keepalived 使用192.168.67.100, #load balancer01master192.168.67.101, #load balancer02backupkubernetes,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}] } EOFcfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilekubernetes apiserver-csr.json | cfssljson -bare apiserver#----------------------- #生成 kubectl 连接集群的证书和私钥kubectl 和 apiserver 通信使用 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#----------------------- #生成 kube-proxy 的证书和私钥kube-proxy 和 apiserver 通信使用 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}] } EOFcfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilekubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy#记得删注释chmod x k8s-cert.sh ./k8s-cert.sh #生成CA证书、相关组件的证书和私钥#复制CA证书、apiserver相关证书和私钥到 kubernetes工作目录的 ssl 子目录中 cp ca*pem apiserver*pem /opt/kubernetes/ssl/#上传 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目录中解压 kubernetes 压缩包 cd /opt/k8s/ tar zxvf kubernetes-server-linux-amd64.tar.gz#复制master组件的关键命令文件到 kubernetes工作目录的 bin 子目录中 cd /opt/k8s/kubernetes/server/bin cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/#制作软连接 ln -s /opt/kubernetes/bin/* /usr/local/bin/#创建 bootstrap token 认证文件apiserver 启动时会调用然后就相当于在集群内创建了一个这个用户接下来就可以用 RBAC 给他授权 cd /opt/k8s/ vim token.sh #!/bin/bash #获取随机数前16个字节内容以十六进制格式输出并删除其中空格 BOOTSTRAP_TOKEN$(head -c 16 /dev/urandom | od -An -t x | tr -d ) #生成 token.csv 文件按照 Token序列号,用户名,UID,用户组 的格式生成 cat /opt/kubernetes/cfg/token.csv EOF ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,system:kubelet-bootstrap EOFchmod x token.sh ./token.shcat /opt/kubernetes/cfg/token.csv#二进制文件、token、证书都准备好后开启 apiserver 服务 cd /opt/k8s/./apiserver.sh 192.168.67.102 https://192.168.67.102:2379,https://192.168.67.103:2379,https://192.168.67.104:2379 #指定当前服务器的地址和etcd集群的地址#检查进程是否启动成功 ps aux | grep kube-apiserverss -natp | grep 6443 #安全端口6443用于接收HTTPS请求用于基于Token文件或客户端证书等认证#启动 scheduler 服务 cd /opt/k8s/vim scheduler.sh #!/bin/bash ##创建 kube-scheduler 启动参数配置文件 MASTER_ADDRESS$1cat /opt/kubernetes/cfg/kube-scheduler EOF KUBE_SCHEDULER_OPTS--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --leader-electtrue \\ --kubeconfig/opt/kubernetes/cfg/kube-scheduler.kubeconfig \\ --bind-address127.0.0.1 EOF#-–kubeconfig连接 apiserver 用的配置文件用于识别 k8s 集群 #--leader-electtrue当该组件启动多个时自动启动 leader 选举 #k8s 中 Controller-Manager 和 Scheduler 的选主逻辑k8s 中的 etcd 是整个集群所有状态信息的存储涉及数据的读写和多个 etcd 之间数据的同步对数据的一致性要求严格所以使用较复杂的 raft 算法来选择用于提交数据的主节点。而 apiserver 作为集群入口本身是无状态的 web 服务器多个 apiserver 服务之间直接负载请求并不需要做选主。Controller-Manager 和 Scheduler 作为任务类型的组件比如 controller-manager 内置的 k8s 各种资源对象的控制器实时的 watch apiserver 获取对象最新的变化事件做期望状态和实际状态调整scheduler watch 未绑定节点的 pod 做节点选择 显然多个这些任务同时工作是完全没有必要的所以 controller-manager 和 scheduler 也是需要选主的但是选主逻辑和 etcd 不一样的这里只需要保证从多个 controller-manager 和 scheduler 之间选出一个 leader 进入工作状态即可而无需考虑它们之间的数据一致和同步。##生成kube-scheduler证书 #切换到k8s证书目录操作 cd /opt/k8s/k8s-cert/ #创建证书请求文件 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#生成kubeconfig配置文件 KUBE_CONFIG/opt/kubernetes/cfg/kube-scheduler.kubeconfig KUBE_APISERVERhttps://192.168.67.102:6443#配置kubernetes集群参数 kubectl config set-cluster kubernetes \--certificate-authority/opt/kubernetes/ssl/ca.pem \--embed-certstrue \--server${KUBE_APISERVER} \--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}##创建 kube-scheduler.service 服务管理文件 cat /usr/lib/systemd/system/kube-scheduler.service EOF [Unit] DescriptionKubernetes Scheduler Documentationhttps://github.com/kubernetes/kubernetes[Service] EnvironmentFile-/opt/kubernetes/cfg/kube-scheduler ExecStart/opt/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS Restarton-failure[Install] WantedBymulti-user.target EOFsystemctl daemon-reload systemctl enable kube-scheduler systemctl restart kube-scheduler ./scheduler.shps aux | grep kube-scheduler#启动 controller-manager 服务 vim controller-manager.sh#!/bin/bash ##创建 kube-controller-manager 启动参数配置文件 MASTER_ADDRESS$1cat /opt/kubernetes/cfg/kube-controller-manager 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#––leader-elect当该组件启动多个时自动选举HA #-–kubeconfig连接 apiserver 用的配置文件用于识别 k8s 集群 #--cluster-cidr10.244.0.0/16pod资源的网段需与pod网络插件的值设置一致。通常Flannel网络插件的默认为10.244.0.0/16Calico插件的默认值为192.168.0.0/16 #--cluster-signing-cert-file/–-cluster-signing-key-file自动为kubelet颁发证书的CA与apiserver保持一致。指定签名的CA机构根证书用来签名为 TLS BootStrapping 创建的证书和私钥 #--root-ca-file指定根CA证书文件路径用来对 kube-apiserver 证书进行校验指定该参数后才会在 Pod 容器的 ServiceAccount 中放置该 CA 证书文件 #--experimental-cluster-signing-duration设置为 TLS BootStrapping 签署的证书有效时间为10年默认为1年##生成kube-controller-manager证书 #切换到k8s证书目录操作 cd /opt/k8s/k8s-cert/ #创建证书请求文件 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#生成kubeconfig配置文件 KUBE_CONFIG/opt/kubernetes/cfg/kube-controller-manager.kubeconfig KUBE_APISERVERhttps://192.168.67.102:6443#配置kubernetes集群参数 kubectl config set-cluster kubernetes \--certificate-authority/opt/kubernetes/ssl/ca.pem \--embed-certstrue \--server${KUBE_APISERVER} \--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}##创建 kube-controller-manager.service 服务管理文件 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 ExecStart/opt/kubernetes/bin/kube-controller-manager \$KUBE_CONTROLLER_MANAGER_OPTS Restarton-failure[Install] WantedBymulti-user.target EOFsystemctl daemon-reload systemctl enable kube-controller-manager systemctl restart kube-controller-manager./controller-manager.shps aux | grep kube-controller-manager#生成kubectl连接集群的kubeconfig文件 vim admin.sh#!/bin/bash mkdir /root/.kube KUBE_CONFIG/root/.kube/config KUBE_APISERVERhttps://192.168.67.102:6443#切换到k8s证书目录操作 cd /opt/k8s/k8s-cert/#配置kubernetes集群参数 kubectl config set-cluster kubernetes \--certificate-authority/opt/kubernetes/ssl/ca.pem \--embed-certstrue \--server${KUBE_APISERVER} \--kubeconfig${KUBE_CONFIG} #配置客户端认证参数 kubectl config set-credentials admin \--client-certificate./admin.pem \--client-key./admin-key.pem \--embed-certstrue \--kubeconfig${KUBE_CONFIG} #设置设置一个环境项配置上下文参数 kubectl config set-context default \--clusterkubernetes \--useradmin \--kubeconfig${KUBE_CONFIG} #设置默认环境上下文 kubectl config use-context default --kubeconfig${KUBE_CONFIG} #生成的 kubeconfig 被保存到 /root/.kube/config 文件######################################################### #集群参数 #本段设置了所需要访问的集群的信息。使用set-cluster设置了需要访问的集群如上为kubernetes这只是个名称实际为--server指向的apiserver--certificate-authority设置了该集群的公钥--embed-certs为true表示将--certificate-authority证书写入到kubeconfig中--server则表示该集群的kube-apiserver地址#用户参数 #本段主要设置用户的相关信息主要是用户证书。如上的用户名为admin证书为/opt/kubernetes/ssl/admin.pem私钥为/opt/kubernetes/ssl/admin-key.pem。注意客户端的证书首先要经过集群CA的签署否则不会被集群认可。此处使用的是ca认证方式也可以使用token认证如kubelet的 TLS Boostrap 机制下的 bootstrapping 使用的就是token认证方式。上述kubectl使用的是ca认证不需要token字段#上下文参数 #集群参数和用户参数可以同时设置多对在上下文参数中将集群参数和用户参数关联起来。上面的上下文名称为default集群为kubenetes用户为admin表示使用admin的用户凭证来访问kubenetes集群的default命名空间也可以增加--namspace来指定访问的命名空间。#最后使用 kubectl config use-context default 来使用名为 default 的环境项来作为配置。 如果配置了多个环境项可以通过切换不同的环境项名字来访问到不同的集群环境。 #########################################################./admin.sh#绑定默认cluster-admin管理员集群角色授权kubectl访问集群 kubectl create clusterrolebinding cluster-system-anonymous --clusterrolecluster-admin --usersystem:anonymous#通过kubectl工具查看当前集群组件状态 kubectl get cs#查看版本信息 kubectl version2.6 部署 Worker Node 组件 获取二进制文件 kubelet ube-proxy准备 kubelet kube-proxy 的kubeconfig 集群引导配置文件 kube-proxy.kubeconfig bootstrap.kubeconfigkubelet首次访问apiserver加入K8S集群使用引导文件准备 kubelet kube-proxy 的服务进程启动参数配置文件启动 kubelet 服务进程向 apiserver 发起 CSR 请求颁发证书master 通过 CSR 请求后 kubelet 方可获取到证书加载 ipvs 模块启动 kube-proxy 服务进程执行 kubectl get nodes 命令查看node的状态 2.6.1 在所有 node 节点上操作 2.6.1.1 node01部署 #创建kubernetes工作目录 mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}#上传 node.zip 到 /opt 目录中解压 node.zip 压缩包获得kubelet.sh、proxy.sh cd /opt/ unzip node.zip chmod x kubelet.sh proxy.shmkdir k8s mv node.zip kubelet.sh proxy.sh k8s/#在 master01 节点上操作 #把 kubelet、kube-proxy 拷贝到 node 节点 cd /opt/k8s/kubernetes/server/bin scp kubelet kube-proxy root192.168.67.103:/opt/kubernetes/bin/ scp kubelet kube-proxy root192.168.67.104:/opt/kubernetes/bin/#上传kubeconfig.sh文件到/opt/k8s/kubeconfig目录中生成kubelet初次加入集群引导kubeconfig文件和kube-proxy.kubeconfig文件 #kubeconfig 文件包含集群参数CA 证书、API Server 地址客户端参数上面生成的证书和私钥集群 context 上下文参数集群名称、用户名。Kubenetes 组件如 kubelet、kube-proxy通过启动时指定不同的 kubeconfig 文件可以切换到不同的集群连接到 apiserver。 mkdir /opt/k8s/kubeconfigvim kubeconfig.sh#!/bin/bash #example: kubeconfig 192.168.67.102 /opt/k8s/k8s-cert/ #创建bootstrap.kubeconfig文件 #该文件中内置了 token.csv 中用户的 Token以及 apiserver CA 证书kubelet 首次启动会加载此文件使用 apiserver CA 证书建立与 apiserver 的 TLS 通讯使用其中的用户 Token 作为身份标识向 apiserver 发起 CSR 请求BOOTSTRAP_TOKEN$(awk -F , {print $1} /opt/kubernetes/cfg/token.csv) APISERVER$1 SSL_DIR$2export KUBE_APISERVERhttps://$APISERVER:6443# 设置集群参数 kubectl config set-cluster kubernetes \--certificate-authority$SSL_DIR/ca.pem \--embed-certstrue \--server${KUBE_APISERVER} \--kubeconfigbootstrap.kubeconfig #--embed-certstrue表示将ca.pem证书写入到生成的bootstrap.kubeconfig文件中# 设置客户端认证参数kubelet 使用 bootstrap token 认证 kubectl config set-credentials kubelet-bootstrap \--token${BOOTSTRAP_TOKEN} \--kubeconfigbootstrap.kubeconfig# 设置上下文参数 kubectl config set-context default \--clusterkubernetes \--userkubelet-bootstrap \--kubeconfigbootstrap.kubeconfig# 使用上下文参数生成 bootstrap.kubeconfig 文件 kubectl config use-context default --kubeconfigbootstrap.kubeconfig#----------------------#创建kube-proxy.kubeconfig文件 # 设置集群参数 kubectl config set-cluster kubernetes \--certificate-authority$SSL_DIR/ca.pem \--embed-certstrue \--server${KUBE_APISERVER} \--kubeconfigkube-proxy.kubeconfig# 设置客户端认证参数kube-proxy 使用 TLS 证书认证 kubectl config set-credentials kube-proxy \--client-certificate$SSL_DIR/kube-proxy.pem \--client-key$SSL_DIR/kube-proxy-key.pem \--embed-certstrue \--kubeconfigkube-proxy.kubeconfig# 设置上下文参数 kubectl config set-context default \--clusterkubernetes \--userkube-proxy \--kubeconfigkube-proxy.kubeconfig# 使用上下文参数生成 kube-proxy.kubeconfig 文件 kubectl config use-context default --kubeconfigkube-proxy.kubeconfigcd /opt/k8s/kubeconfig chmod x kubeconfig.sh./kubeconfig.sh 192.168.67.102 /opt/k8s/k8s-cert/ #指定本地地址和证书所在目录#把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷贝到 node 节点 scp bootstrap.kubeconfig kube-proxy.kubeconfig root192.168.67.103:/opt/kubernetes/cfg/scp bootstrap.kubeconfig kube-proxy.kubeconfig root192.168.67.104:/opt/kubernetes/cfg/#RBAC授权使用户 kubelet-bootstrap 能够有权限发起 CSR 请求证书 kubectl create clusterrolebinding kubelet-bootstrap --clusterrolesystem:node-bootstrapper --userkubelet-bootstrap------------------------------------------------------------------------------------------ kubelet 采用 TLS Bootstrapping 机制自动完成到 kube-apiserver 的注册在 node 节点量较大或者后期自动扩容时非常有用。 Master apiserver 启用 TLS 认证后node 节点 kubelet 组件想要加入集群必须使用CA签发的有效证书才能与 apiserver 通信当 node 节点很多时签署证书是一件很繁琐的事情。因此 Kubernetes 引入了 TLS bootstraping 机制来自动颁发客户端证书kubelet 会以一个低权限用户自动向 apiserver 申请证书kubelet 的证书由 apiserver 动态签署。kubelet 首次启动通过加载 bootstrap.kubeconfig 中的用户 Token 和 apiserver CA 证书发起首次 CSR 请求这个 Token 被预先内置在 apiserver 节点的 token.csv 中其身份为 kubelet-bootstrap 用户和 system:kubelet-bootstrap 用户组想要首次 CSR 请求能成功即不会被 apiserver 401 拒绝则需要先创建一个 ClusterRoleBinding将 kubelet-bootstrap 用户和 system:node-bootstrapper 内置 ClusterRole 绑定通过 kubectl get clusterroles 可查询使其能够发起 CSR 认证请求。TLS bootstrapping 时的证书实际是由 kube-controller-manager 组件来签署的也就是说证书有效期是 kube-controller-manager 组件控制的kube-controller-manager 组件提供了一个 --experimental-cluster-signing-duration 参数来设置签署的证书有效时间默认为 8760h0m0s将其改为 87600h0m0s即 10 年后再进行 TLS bootstrapping 签署证书即可。也就是说 kubelet 首次访问 API Server 时是使用 token 做认证通过后Controller Manager 会为 kubelet 生成一个证书以后的访问都是用证书做认证了。 ------------------------------------------------------------------------------------------#在 node01 节点上操作 #启动 kubelet 服务 cd /opt/k8svim kubelet.sh#!/bin/bashNODE_ADDRESS$1 DNS_SERVER_IP${2:-10.0.0.2}#创建 kubelet 启动参数配置文件 cat /opt/kubernetes/cfg/kubelet EOF KUBELET_OPTS--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --hostname-override${NODE_ADDRESS} \\ --network-plugincni \\ --kubeconfig/opt/kubernetes/cfg/kubelet.kubeconfig \\ --bootstrap-kubeconfig/opt/kubernetes/cfg/bootstrap.kubeconfig \\ --config/opt/kubernetes/cfg/kubelet.config \\ --cert-dir/opt/kubernetes/ssl \\ --pod-infra-container-imageregistry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2 EOF#--hostname-override指定kubelet节点在集群中显示的主机名或IP地址默认使用主机hostnamekube-proxy和kubelet的此项参数设置必须完全一致 #--network-plugin启用CNI #--kubeconfig指定kubelet.kubeconfig文件位置当前为空路径会自动生成用于如何连接到apiserver里面含有kubelet证书master授权完成后会在node节点上生成 kubelet.kubeconfig 文件 #--bootstrap-kubeconfig指定连接 apiserver 的 bootstrap.kubeconfig 文件 #--config指定kubelet配置文件的路径启动kubelet时将从此文件加载其配置 #--cert-dir指定master颁发的kubelet证书生成目录 #--pod-infra-container-image指定Pod基础容器Pause容器的镜像。Pod启动的时候都会启动一个这样的容器每个pod里容器之间的相互通信需要Pause的支持启动Pause需要Pause基础镜像#---------------------- #创建kubelet配置文件该文件实际上就是一个yml文件语法非常严格不能出现tab键冒号后面必须要有空格每行结尾也不能有空格 cat /opt/kubernetes/cfg/kubelet.config EOF kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 address: ${NODE_ADDRESS} port: 10250 readOnlyPort: 10255 cgroupDriver: systemd clusterDNS: - ${DNS_SERVER_IP} clusterDomain: cluster.local failSwapOn: false authentication:anonymous:enabled: true EOF#PS当命令行参数与此配置文件kubelet.config有相同的值时就会覆盖配置文件中的该值。#---------------------- #创建 kubelet.service 服务管理文件 cat /usr/lib/systemd/system/kubelet.service EOF [Unit] DescriptionKubernetes Kubelet Afterdocker.service Requiresdocker.service[Service] EnvironmentFile/opt/kubernetes/cfg/kubelet ExecStart/opt/kubernetes/bin/kubelet \$KUBELET_OPTS Restarton-failure KillModeprocess[Install] WantedBymulti-user.target EOFsystemctl daemon-reload systemctl enable kubelet systemctl restart kubelet./kubelet.sh 192.168.67.103 node01ps aux | grep kubelet#在 master01 节点上操作通过 CSR 请求 #检查到 node01 节点的 kubelet 发起的 CSR 请求Pending 表示等待集群给该节点签发证书 kubectl get csrkubectl certificate approve node-csr-VXBLUwWvGyHmU38mqZ3xusiKmDxzDVJc1okyRinafvwkubectl get csrkubectl get node#在 node01 节点上操作 #加载 ip_vs 模块 for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o ^[^.]*);do echo $i; /sbin/modinfo -F filename $i /dev/null 21 /sbin/modprobe $i;done#启动proxy服务 cd /opt/k8svim proxy.sh#!/bin/bashNODE_ADDRESS$1#创建 kube-proxy 启动参数配置文件 cat /opt/kubernetes/cfg/kube-proxy EOF KUBE_PROXY_OPTS--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --hostname-override${NODE_ADDRESS} \\ --cluster-cidr10.244.0.0/16 \\ --proxy-modeipvs \\ --kubeconfig/opt/kubernetes/cfg/kube-proxy.kubeconfig EOF#--hostnameOverride: 参数值必须与 kubelet 的值一致否则 kube-proxy 启动后会找不到该 Node从而不会创建任何 ipvs 规则 #--cluster-cidr指定 Pod 网络使用的聚合网段Pod 使用的网段和 apiserver 中指定的 service 的 cluster ip 网段不是同一个网段。 kube-proxy 根据 --cluster-cidr 判断集群内部和外部流量指定 --cluster-cidr 选项后 kube-proxy 才会对访问 Service IP 的请求做 SNAT即来自非 Pod 网络的流量被当成外部流量访问 Service 时需要做 SNAT。 #--kubeconfig: 指定连接 apiserver 的 kubeconfig 文件 #--proxy-mode指定流量调度模式为ipvs模式可添加--ipvs-scheduler选项指定ipvs调度算法rr|lc|dh|sh|sed|nq #rr: round-robin轮询。 #lc: least connection最小连接数。 #dh: destination hashing目的地址哈希。 #sh: source hashing ,原地址哈希。 #sed: shortest expected delay最短期望延时。 #nq: never queue 永不排队。#---------------------- #创建 kube-proxy.service 服务管理文件 cat /usr/lib/systemd/system/kube-proxy.service EOF [Unit] DescriptionKubernetes Proxy Afternetwork.target[Service] EnvironmentFile-/opt/kubernetes/cfg/kube-proxy ExecStart/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS Restarton-failure[Install] WantedBymulti-user.target EOFsystemctl daemon-reload systemctl enable kube-proxy systemctl restart kube-proxy./proxy.sh 192.168.67.103 ps aux | grep kube-proxy2.6.1.2 node02 节点部署 #在 node01 节点上操作 cd /opt/k8s scp kubelet.sh proxy.sh root192.168.67.104:/opt/#在 node02 节点上操作 #启动kubelet服务 cd /opt/ chmod x kubelet.sh ./kubelet.sh 192.168.67.104#在 master01 节点上操作 kubectl get csr#通过 CSR 请求 kubectl certificate approve node-csr-WSrwQuqYysVMvZdjTyZRkN0-D8LPXV38Zuynor0R16k kubectl get csr#加载 ip_vs 模块 for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o ^[^.]*);do echo $i; /sbin/modinfo -F filename $i /dev/null 21 /sbin/modprobe $i;done#使用proxy.sh脚本启动proxy服务 ./proxy.sh 192.168.67.104 ps aux | grep kube-proxy
http://www.huolong8.cn/news/286788/

相关文章:

  • 网站流量统计软件建设工程敎育网网站
  • 住建培训网站Wix网站开发 工作室
  • 济南网站建设哪家强linux目录不可写 wordpress
  • 免费做店招的网站营销网站的例子
  • 响应式网站制作流程图找项目网
  • 一个完整的网站设计需要的技术长治企业网站建设
  • 企业网站程序源码专业酒店建设信息网站
  • 网站设计 企业 济南现在去成都安全吗
  • 网站怎么做二维码网站开发图片框
  • 公众号引流推广平台对seo的理解
  • 服装网站建设规划书怎么写如何在微信公众号里建设微网站
  • 网站设计网站机构龙岗商城网站建设最好
  • 网站建设和维护工作内容365建筑人才网
  • 如何申请建设网站线下引流的八种推广方式
  • 专业网站开发哪里有网站第三方统计工具下载
  • 燕郊 网站开发百度站长收录入口
  • 旅游网站论文我的网站百度找不到
  • 北京住房投资建设中心网站首页企业网站开发报价单
  • 北京大型网站建设公司深圳网页设计与制作公司
  • wordpress自动回复商城网站如何优化
  • 湖南移动网站建设苏州建设营销网站
  • 圣宠宠物网站建设做老托福听力的网站
  • 简单大方网站网络营销都有哪些内容
  • 企业网站seo关键词优化排名思路手机百度网址是什么
  • 简历免费在线制作网站网站建设市场数据分析
  • 网站用ps如何做华为云网站建设怎么设置选择项
  • 站长统计推荐网站升级维护
  • 常州微信网站建设服务wordpress模版sns
  • 如何将网站地图提交给百度wordpress 调试
  • 大连 网站建设 有限公司58好项目网