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

cad图做网站链接做投票链接网站

cad图做网站链接,做投票链接网站,深圳企业做网站公司哪家好,网站开发入门前言#xff1a;终于写到kubernetes#xff08;k8s#xff09;#xff0c;容器编排工具不止k8s一个#xff0c;它的优势在于搭建集群#xff0c;也是传统运维和云计算运维的第一道门槛#xff0c;这里会列出两种安装方式#xff0c;详细步骤会在下文列出#xff0c;文…前言终于写到kubernetesk8s容器编排工具不止k8s一个它的优势在于搭建集群也是传统运维和云计算运维的第一道门槛这里会列出两种安装方式详细步骤会在下文列出文章很长根据目录取用。 1、kubernetes基础名词 官网地址Kubernetes 中文网地址Kubernetes 中文网 官网 一个简单的k8s集群组成包含以下内容 k8s-master 负责任务调度控制节点 k8s-node1 承载运⾏pod(容器) k8s-node2 承载运⾏pod(容器) Master Master主要负责资源调度控制副本和提供统⼀访问集群的⼊⼝。--核⼼节点也是管理节点 Node Node是Kubernetes集群架构中运⾏Pod的服务节点。Node是Kubernetes集群操作的单元⽤来承 载被分配Pod的运⾏是Pod运⾏的宿主机由Master管理并汇报容器状态给Master同时根据Master要求管理容器⽣命周期。同时k8s自带高可用例如一个pod容器集合被创建在node1上node1故障pod自动转移到其他健康的node节点。 Node IP Node节点的IP地址是Kubernetes集群中每个节点的物理⽹卡的IP地址是真实存在的物理⽹ 络所有属于这个⽹络的服务器之间都能通过这个⽹络直接通信这里指演示用的虚拟机的ip pod Pod直译是⾖荚可以把容器想像成⾖荚⾥的⾖⼦把⼀个或多个关系紧密的⾖⼦包在⼀起就是⾖荚 ⼀个Pod。 在k8s中我们不会直接操作容器⽽是把容器包装成Pod再进⾏管理运⾏于Node节点 上 若⼲相关容器的组合被称为pod。 Pod内包含的容器运⾏在同⼀宿主机上使⽤相同的⽹络命名空间、IP地址和端⼝能够通过localhost进⾏通信。 Pod是k8s进⾏创建、调度和管理的最⼩单位它提供了⽐容器更⾼层次的抽象存在使得部署和管理更加灵活。⼀个Pod可以包含⼀个容器或者多个相关容器。 Pod 就是 k8s 集群⾥的应⽤⽽⼀个平台应⽤可以由多个容器组成。 pod的具象图如下   ​ pause容器 每个Pod中都有⼀个pause容器pause容器做为Pod的⽹络接⼊点Pod中其他的容器会使⽤容器映射模式启动并接⼊到这个pause容器解决pod内容器相互间通讯问题。 属于同⼀个Pod的所有容器共享⽹络的namespace。 Pod Volume卷挂载 Docker Volume对应Kubernetes中的Pod Volume 数据卷挂载宿主机⽂件、⽬录或者外部存储到Pod中为应⽤服务提供存储也可以解决Pod中容器之间共享数据。 资源限制 每个Pod可以设置限额的计算机资源有CPU和Memory pod无法挂起只能创建/运行和删除 ​ ​ Event 事件在 Kubernetes 中Pod 可以产生各种事件Events这些事件记录了 Pod 的状态变化和相关操作例如创建、删除、调度、启动失败等。事件帮助管理员和开发者了解和诊断 Pod 的运行状态。Event通常关联到具体资源对象上是排查故障的重要参考信息 Pod IP Pod的IP地址是Docker Engine根据docker⽹桥的IP地址段进⾏分配的通常是⼀个虚拟的⼆层⽹络位于不同Node上的Pod能够彼此通信需要通过Pod IP所在的虚拟⼆层⽹络进⾏通信⽽ 真实的TCP流量则是通过Node IP所在的物理⽹卡流出的。 2、Kubernetes架构和组件 架构图 一个master4个node一个被展开 这里我用一个流程来说明各个组件之间的作用 1. 用户提交请求 想象一下你在办公室里用电脑向任务管理系统提交一个请求。比如你需要创建三个 Tomcat 应用程序实例。你通过 kubectl 命令行工具发出这个请求指示 Kubernetes 控制中心Master来处理这个任务。 2. API Server 接受请求 Kubernetes 控制中心的 API Server 就像是任务管理系统的接待员它负责接收和记录你的请求。API Server 将你的请求记录到一个专用的电子数据库——etcd这个数据库保存了集群的所有状态信息。 3. 调度器Scheduler读取信息 调度器Scheduler是负责将任务分配到集群中不同节点的项目经理。他从 API Server 中读取请求信息并开始分析集群中的所有节点。Scheduler 扫描各个节点找出那些负载较低、资源充足的节点以决定将你的任务分配到哪里。 4. 调度器选择节点并返回请求 在找到适合的节点之后调度器将决定将任务分配到哪个节点。然后它通过 API Server 将这一决定通知给集群管理系统记录下新的任务分配安排。 5. 节点组件的角色 每个节点Node上都有两个重要组件 Kubelet它类似于团队中的项目主管负责确保 Pod 在节点上被正确创建和运行。 Kubernetes Proxy像是负责沟通的协调员处理进出节点的流量将外部请求正确地转发到对应的 Pod 上。 6. Kubelet 接收任务并创建容器 一旦调度器的决策通过 API Server 传递到节点Kubelet 接收到这个任务后开始着手准备。它会调用本地的容器运行时如 Docker通过 Docker 命令创建并启动容器确保 Tomcat 应用程序的 Pod 在节点上运行。 7. 维持 Pod 的副本数量 假设你请求创建了三个 Tomcat Pod这个请求会被 Replication Controller 记录下来。Replication Controller 的工作是确保集群中始终保持这个数量的副本。如果有一个 Tomcat Pod 被删除Replication Controller 会自动重新创建一个新的 Pod以维持副本数量始终为三。这一机制确保应用程序的高可用性。 Replication Controller 通过标签管理副本 Deployment 副本3标签选择器app: tomcat Tomcat Pods tomcat-pod1标签app: tomcat tomcat-pod2标签app: tomcat tomcat-pod3标签app: tomcat Replication Controller 实际上是在管理这些带有特定标签的 Pod通过标签确保 Pod 的数量与预期一致。 8. etcd 数据库的作用 etcd 是 Kubernetes 的专用数据库它保存了所有集群状态的信息包括 Pod 的创建、删除以及副本数量等数据。API Server 和 etcd 之间不断地进行交互以确保集群状态的准确性。etcd 是集群中最先部署的组件必须保持可靠和高效。 9. Pod 的暴露和流量转发 创建并运行的容器需要向互联网用户开放访问。为了实现这一点Pod 需要被暴露出来。Kubernetes Proxy 负责处理流量转发的工作。它根据预设的规则将外部请求转发到节点的 IP 地址并将这些请求进一步转发到 Pod 的 IP 地址和端口号。Kubernetes Proxy 自动创建和管理这些转发规则确保用户能够访问到所需的服务。 各个组件概念如下 Kubernetes Master Kubernetes Master是集群控制节点负责整个集群的管理和控制所有控制命令基本都是由Master节点执行。主要组件包括 Kubernetes API Server 系统入口封装核心对象的增删改查操作。通过RESTful API接口提供服务数据持久化到Etcd中。 Kubernetes Scheduler 为新建Pod选择节点进行资源调度。组件可替换支持使用其他调度器。 Kubernetes Controller 负责执行各种控制器以保证Kubernetes的正常运行主要控制器包括 Replication Controller管理Pod副本数量确保实际副本数量与定义一致。Deployment Controller管理Deployment及其Pod控制Pod更新。Node Controller检查Node健康状态标识失效和正常Node。Namespace Controller清理无效Namespace及其API对象。Service Controller管理服务负载和代理。EndPoints Controller关联Service和Pod创建和更新Endpoints。Service Account Controller创建和管理Service Account及其Secret。Persistent Volume Controller管理Persistent Volume和Claim执行绑定和清理。Daemon Set Controller创建Daemon Pod确保在指定Node上运行。Job Controller管理Job及其一次性任务Pod。Pod Autoscaler Controller实现Pod的自动伸缩根据监控数据和策略进行伸缩。 Kubernetes Node Node节点是Kubernetes集群中的工作负载节点Master负责分配工作负载如Docker容器并在节点宕机时将工作负载转移到其他节点。主要组件包括 Kubelet 管理容器从API Server接收Pod创建请求启动、停止容器监控状态并报告给API Server。 Kubernetes Proxy 为Pod创建代理服务获取Service信息并进行请求路由和转发实现虚拟转发网络。 Docker Engine 负责容器的创建和管理。 Flanneld网络插件 提供网络功能。 数据库etcd 分布式键值存储系统用于保存集群状态数据如Pod、Service等推荐独立部署。 3、Kubernetes部署方式 ⽅式1. minikube Minikube是⼀个⼯具可以在本地快速运⾏⼀个单点的Kubernetes尝试Kubernetes或⽇常开发 的⽤户使⽤。不能⽤于⽣产环境。 官⽅地址https://kubernetes.io/docs/setup/minikube/ ⽅式2. kubeadm Kubeadm也是⼀个⼯具提供kubeadm init和kubeadm join⽤于快速部署Kubernetes集群。 官⽅地址https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/ ⽅式3.yum安装 直接使⽤epel-release yum源缺点就是版本较低 1.5 ⽅式4. ⼆进制包 从官⽅下载发⾏版的⼆进制包⼿动部署每个组件组成Kubernetes集群。 4、kubernetes部署二进制 ⽬标任务 1、Kubernetes集群部署架构规划 2、部署Etcd数据库集群 3、在Node节点安装Docker 4、部署Flannel⽹络插件用于不同node上容器之间通信 5、在Master节点部署组件api-server,schduler,controller-manager 6、在Node节点部署组件kubelet,kube-proxy 7、查看集群状态 8、运⾏⼀个测试示例 9、部署DashboardWeb UI 可选 系统环境centos7,开启ssh登录关闭防火墙关闭selinux、设置静态ip、时间同步 k8s所需安装包 链接https://pan.baidu.com/s/1_SU8KtVuzUBh-P4FJW-8GQ?pwdbo2j  提取码bo2j  修改主机名3个节点互相配置域名解析角色如下一般情况下是有两个master做高可用这里只用一个后续会演示集群扩展 IP角色192.168.188.101k8s-master1192.168.188.102k8s-node1192.168.188.103k8s-node2 4.1、部署Etcd集群 这里是由三个节点组成的etcd集群正常情况etcd数据库应当和k8s分开部署。 三个etcd之间通信需要https协议所以需要先做自签名证书。 下载cfssl工具下载的这些是可执行的二进制命令直接用就可以了 [rootk8s-master1 ~]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 [rootk8s-master1 ~]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 [rootk8s-master1 ~]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 外网环境不稳定的使用云盘下载上传[rootk8s-master1 ~]# ls anaconda-ks.cfg cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64 [rootk8s-master1 ~]# chmod x cfssl* [rootk8s-master1 ~]# ls anaconda-ks.cfg cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64 [rootk8s-master1 ~]# mv cfssl_linux-amd64 /usr/local/bin/cfssl [rootk8s-master1 ~]# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson [rootk8s-master1 ~]# mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo[rootk8s-master1 ~]# mkdir cert [rootk8s-master1 ~]# cd cert/ [rootk8s-master1 cert]# vim ca-config.json #生成ca中心的文件 [rootk8s-master1 cert]# cat ca-config.json {signing: {default: {expiry: 87600h},profiles: {www: {expiry: 87600h,usages: [signing,key encipherment,server auth,client auth]}}} } [rootk8s-master1 cert]#[rootk8s-master1 cert]# vim ca-csr.json #生成ca中心的请求文件 [rootk8s-master1 cert]# cat ca-csr.json {CN: etcd CA,key: {algo: rsa,size: 2048},names: [{C: CN,L: Beijing,ST: Beijing}] } [rootk8s-master1 cert]# [rootk8s-master1 cert]# vim server-csr.json #服务器证书的请求文件 [rootk8s-master1 cert]# cat server-csr.json {CN: etcd,hosts: [192.168.188.101,192.168.188.102,192.168.188.103],key: {algo: rsa,size: 2048},names: [{C: CN,L: BeiJing,ST: BeiJing}] } [rootk8s-master1 cert]# 生成ca认证中心  [rootk8s-master1 cert]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca - 2024/08/11 11:00:59 [INFO] generating a new CA key and certificate from CSR 2024/08/11 11:00:59 [INFO] generate received request 2024/08/11 11:00:59 [INFO] received CSR 2024/08/11 11:00:59 [INFO] generating key: rsa-2048 2024/08/11 11:00:59 [INFO] encoded CSR 2024/08/11 11:00:59 [INFO] signed certificate with serial number 405945695011591619580436183577511508583558427674 [rootk8s-master1 cert]# ls ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem server-csr.json [rootk8s-master1 cert]# 生成了ca-key.pemca私钥 ca.pemca证书 根据ca证书和私钥根据证书请求文件签发证书 [rootk8s-master1 cert]# cfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilewww server-csr.json | cfssljson -bare server 2024/08/11 11:06:39 [INFO] generate received request 2024/08/11 11:06:39 [INFO] received CSR 2024/08/11 11:06:39 [INFO] generating key: rsa-2048 2024/08/11 11:06:39 [INFO] encoded CSR 2024/08/11 11:06:39 [INFO] signed certificate with serial number 222112643168924562880572112923105301745282612424 2024/08/11 11:06:39 [WARNING] This certificate lacks a hosts field. This makes it unsuitable for websites. For more information see the Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org); specifically, section 10.2.3 (Information Requirements). [rootk8s-master1 cert]# ls ca-config.json ca-csr.json ca.pem server-csr.json server.pem ca.csr ca-key.pem server.csr server-key.pem [rootk8s-master1 cert]# 查看生成的内容 [rootk8s-master1 cert]# ls *pem ca-key.pem ca.pem server-key.pem server.pemca证书 ca私钥 server证书 server证书对应的私钥 安装Etcd 二进制包下载地址Release v3.2.12 · etcd-io/etcd · GitHub [rootk8s-master1 cert]# cd .. [rootk8s-master1 ~]# wget https://github.com/etcd-io/etcd/releases/download/v3.2.12/etcd-v3.2.12-linux-amd64.tar.gz# 云盘链接里面有 [rootk8s-master1 ~]# ls anaconda-ks.cfg cert etcd-v3.2.12-linux-amd64.tar.gz将这个包分发给另外两个节点需要部署etcd的节点 [rootk8s-master1 ~]# scp etcd-v3.2.12-linux-amd64.tar.gz k8s-node1:/root/ [rootk8s-master1 ~]# scp etcd-v3.2.12-linux-amd64.tar.gz k8s-node2:/root/在三个节点执行以下操作 # mkdir -p /opt/etcd/{bin,cfg,ssl}#创建文件存放etcd的程序配置文件证书 # tar -zxvf etcd-v3.2.12-linux-amd64.tar.gz # ls anaconda-ks.cfg cert etcd-v3.2.12-linux-amd64 etcd-v3.2.12-linux-amd64.tar.gz # ls etcd-v3.2.12-linux-amd64 Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md # mv etcd-v3.2.12-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/ # ls /opt/etcd/bin/ etcd etcdctl编写etcd配置文件 注意节点名ip配置删除所有注释每行结尾不能有空格使用set list检查[rootk8s-master1 ~]# vim /opt/etcd/cfg/etcd#[Member] ETCD_NAMEetcd01 #节点名称各个节点不能相同 ETCD_DATA_DIR/var/lib/etcd/default.etcd #启动后自动创建提前创建需要提供权限 ETCD_LISTEN_PEER_URLShttps://192.168.188.101:2380 #写本节点的ip ETCD_LISTEN_CLIENT_URLShttps://192.168.188.101:2379 #写本节点的ip#[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLShttps://192.168.188.101:2380 #写本节点的ip ETCD_ADVERTISE_CLIENT_URLShttps://192.168.188.101:2379 #写本节点的ip ETCD_INITIAL_CLUSTERetcd01https://192.168.188.101:2380,etcd02https://192.168.188.102:2380,etcd03https://192.168.188.103:2380ETCD_INITIAL_CLUSTER_TOKENetcd-cluster ETCD_INITIAL_CLUSTER_STATEnew参数解释 * ETCD_NAME 节点名称,每个节点名称不一样 * ETCD_DATA_DIR 存储数据目录(他是一个数据库不是存在内存的存在硬盘中的所有和k8s有关的信息都会存到etcd里面的) * ETCD_LISTEN_PEER_URLS 集群通信监听地址 * ETCD_LISTEN_CLIENT_URLS 客户端访问监听地址 * ETCD_INITIAL_ADVERTISE_PEER_URLS 集群通告地址 * ETCD_ADVERTISE_CLIENT_URLS 客户端通告地址 * ETCD_INITIAL_CLUSTER 集群节点地址 * ETCD_INITIAL_CLUSTER_TOKEN 集群Token * ETCD_INITIAL_CLUSTER_STATE 加入集群的当前状态new是新集群existing表示加入已有集群 scp到node上在node上根据情况修改文件内容 [rootk8s-master1 ~]# scp /opt/etcd/cfg/etcd k8s-node1:/opt/etcd/cfg/在node1上根据情况修改 [rootk8s-master1 ~]# scp /opt/etcd/cfg/etcd k8s-node2:/opt/etcd/cfg/在node2上根据情况修改 使用systemd管理etcd [rootk8s-master1 ~]# vim /usr/lib/systemd/system/etcd.service [rootk8s-master1 ~]# cat /usr/lib/systemd/system/etcd.service [Unit] DescriptionEtcd Server Afternetwork.target Afternetwork-online.target Wantsnetwork-online.target[Service] Typenotify EnvironmentFile/opt/etcd/cfg/etcd ExecStart/opt/etcd/bin/etcd \ --name${ETCD_NAME} \ --data-dir${ETCD_DATA_DIR} \ --listen-peer-urls${ETCD_LISTEN_PEER_URLS} \ --listen-client-urls${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \ --advertise-client-urls${ETCD_ADVERTISE_CLIENT_URLS} \ --initial-advertise-peer-urls${ETCD_INITIAL_ADVERTISE_PEER_URLS} \ --initial-cluster${ETCD_INITIAL_CLUSTER} \ --initial-cluster-token${ETCD_INITIAL_CLUSTER_TOKEN} \ --initial-cluster-statenew \ --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 Restarton-failure LimitNOFILE65536[Install] WantedBymulti-user.target [rootk8s-master1 ~]# 将此文件scp到node上 [rootk8s-master1 ~]# scp /usr/lib/systemd/system/etcd.service k8s-node1:/usr/lib/systemd/system/ [rootk8s-master1 ~]# scp /usr/lib/systemd/system/etcd.service k8s-node2:/usr/lib/systemd/system/此时先不要载入新建文件需要将证书导入ssl目录下 [rootk8s-master1 ~]# ls /root/cert ca-config.json ca-csr.json ca.pem server-csr.json server.pem ca.csr ca-key.pem server.csr server-key.pem [rootk8s-master1 ~]# ls /opt/etcd/ssl/ [rootk8s-master1 ~]# cd /root/cert/ [rootk8s-master1 cert]# cp *pem /opt/etcd/ssl/[rootk8s-master1 cert]# scp *pem k8s-node1:/opt/etcd/ssl/ [rootk8s-master1 cert]# scp *pem k8s-node2:/opt/etcd/ssl/以下操作在三个节点进行 # systemctl daemon-reload# systemctl start etcd 执行这一步第一个节点会卡住是因为没有同步启动导致没有连接到后续节点不影响后续操作# systemctl enable etcd 检测etcd集群状态命令记得修改ip [rootk8s-master1 cert]# /opt/etcd/bin/etcdctl --ca-file/opt/etcd/ssl/ca.pem --cert-file/opt/etcd/ssl/server.pem --key-file/opt/etcd/ssl/server-key.pem --endpointshttps://192.168.188.101:2379,https://192.168.188.102:2379,https://192.168.188.103:2379 cluster-health member 3aba7a393ca71fa3 is healthy: got healthy result from https://192.168.188.101:2379 member 874e8d481cfbccd7 is healthy: got healthy result from https://192.168.188.103:2379 member ee161a05c1db844b is healthy: got healthy result from https://192.168.188.102:2379 cluster is healthy [rootk8s-master1 cert]# 如果输出上面信息就说明集群部署成功。 如果有问题第一步先看日志/var/log/messages 或 journalctl -u etcd 然后停止etcd数据库然后检查/opt/etcd/cfg/etcd然后删除/var/lib/etcd/default.etcd所有数据重新启动。 4.2、node节点部署docker 卸载原有docker略 部署方式参考上一篇文章 部署完成后暂时不要启动 4.3、部署Flannel网络插件 Flannel 需要通过 etcd 存储自身的子网信息因此必须确保能成功连接 etcd 并写入预定义的子网段。Flannel 应该部署在node节点上而不是在主节点上因为它的作用是为所有容器提供通信功能。如果没有在主节点上部署应用就不需要在主节点上部署 Flannel。 部署flannel需要先在master生成证书 [rootk8s-master1 ~]# cd cert/ [rootk8s-master1 cert]# /opt/etcd/bin/etcdctl \--ca-fileca.pem --cert-fileserver.pem --key-fileserver-key.pem \--endpointshttps://192.168.188.101:2379,https://192.168.188.102:2379,https://192.168.188.103:2379 \set /coreos.com/network/config { Network: 172.17.0.0/16, Backend: {Type: vxlan}} { Network: 172.17.0.0/16, Backend: {Type: vxlan}} [rootk8s-master1 cert]# echo $? 0将生成的证书copy到剩下的机器上 [rootk8s-master1 ~]# scp -r cert/ k8s-node1:/root/ [rootk8s-master1 ~]# scp -r cert/ k8s-node1:/root/ 安装Flannel 两个node节点上完成 # wget https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gz 这里使用云盘文件代替# mkdir -p /opt/kubernetes/bin # tar -zxvf flannel-v0.10.0-linux-amd64.tar.gz flanneld mk-docker-opts.sh README.md # mv flanneld mk-docker-opts.sh /opt/kubernetes/bin/ # mkdir /opt/kubernetes/cfg # vim /opt/kubernetes/cfg/flanneld # cat /opt/kubernetes/cfg/flanneld FLANNEL_OPTIONS--etcd-endpointshttps://192.168.188.101:2379,https://192.168.188.102:2379,https://192.168.188.103:2379 -etcd-cafile/opt/etcd/ssl/ca.pem -etcd-certfile/opt/etcd/ssl/server.pem -etcd-keyfile/opt/etcd/ssl/server-key.pem使用systemd管理flannel 两个node节点上完成 # vim /usr/lib/systemd/system/flanneld.service # cat /usr/lib/systemd/system/flanneld.service [Unit] DescriptionFlanneld overlay address etcd agent Afternetwork-online.target network.target Beforedocker.service[Service] Typenotify EnvironmentFile/opt/kubernetes/cfg/flanneld ExecStart/opt/kubernetes/bin/flanneld --ip-masq $FLANNEL_OPTIONS ExecStartPost/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env Restarton-failure[Install] WantedBymulti-user.target 配置Docker启动指定子网段通过引入flanner配置实现这里可以将源文件直接覆盖掉 两个node节点上完成 # vim /usr/lib/systemd/system/docker.service # cat /usr/lib/systemd/system/docker.service [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service Wantsnetwork-online.target[Service] Typenotify EnvironmentFile/run/flannel/subnet.env ExecStart/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS ExecReload/bin/kill -s HUP $MAINPID LimitNOFILEinfinity LimitNPROCinfinity LimitCOREinfinity TimeoutStartSec0 Delegateyes KillModeprocess Restarton-failure StartLimitBurst3 StartLimitInterval60s[Install] WantedBymulti-user.target启动flannel和docker 两个node节点上完成# systemctl daemon-reload # systemctl start flanneld # systemctl enable flanneld docker Created symlink from /etc/systemd/system/multi-user.target.wants/flanneld.service to /usr/lib/systemd/system/flanneld.service. Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. # systemctl start docker 检查方法 ip a查看生成的网卡 node1与node2的docker互通测试  4.4、在Master节点部署组件 第一步查看etcd数据库和node上docker以及flanner是否正常再进行后续操作 4.4.1、生成证书 创建ca证书 [rootk8s-master1 ~]# mkdir -p /opt/crt/ [rootk8s-master1 ~]# cd /opt/crt/ [rootk8s-master1 crt]# vim ca-config.json [rootk8s-master1 crt]# cat ca-config.json {signing: {default: {expiry: 87600h},profiles: {kubernetes: {expiry: 87600h,usages: [signing,key encipherment,server auth,client auth]}}} }[rootk8s-master1 crt]# vim ca-csr.json [rootk8s-master1 crt]# cat ca-csr.json {CN: kubernetes,key: {algo: rsa,size: 2048},names: [{C: CN,L: Beijing,ST: Beijing,O: k8s,OU: System}] } [rootk8s-master1 crt]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca - 2024/08/12 01:40:59 [INFO] generating a new CA key and certificate from CSR 2024/08/12 01:40:59 [INFO] generate received request 2024/08/12 01:40:59 [INFO] received CSR 2024/08/12 01:40:59 [INFO] generating key: rsa-2048 2024/08/12 01:40:59 [INFO] encoded CSR 2024/08/12 01:40:59 [INFO] signed certificate with serial number 371271588690637678245771582062446800447169685495 [rootk8s-master1 crt]# ls ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem生成api server证书server*.pem给kubelet访问api用 [rootk8s-master1 crt]# vim server-csr.json [rootk8s-master1 crt]# cat server-csr.json {CN: kubernetes,hosts: [10.0.0.1,127.0.0.1,192.168.188.101,192.168.188.102,192.168.188.103,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}] } [rootk8s-master1 crt]# cfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilekubernetes server-csr.json | cfssljson -bare server 2024/08/12 01:47:17 [INFO] generate received request 2024/08/12 01:47:17 [INFO] received CSR 2024/08/12 01:47:17 [INFO] generating key: rsa-2048 2024/08/12 01:47:17 [INFO] encoded CSR 2024/08/12 01:47:17 [INFO] signed certificate with serial number 560513267303898316157650121391556010442151460732 2024/08/12 01:47:17 [WARNING] This certificate lacks a hosts field. This makes it unsuitable for websites. For more information see the Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org); specifically, section 10.2.3 (Information Requirements). [rootk8s-master1 crt]# echo $? 0 [rootk8s-master1 crt]# ls ca-config.json ca-csr.json ca.pem server-csr.json server.pem ca.csr ca-key.pem server.csr server-key.pem生成kube-proxy证书 [rootk8s-master1 crt]# vim kube-proxy-csr.json [rootk8s-master1 crt]# cat kube-proxy-csr.json {CN: system:kube-proxy,hosts: [],key: {algo: rsa,size: 2048},names: [{C: CN,L: BeiJing,ST: BeiJing,O: k8s,OU: System}] }[rootk8s-master1 crt]# cfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilekubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy 2024/08/12 01:52:18 [INFO] generate received request 2024/08/12 01:52:18 [INFO] received CSR 2024/08/12 01:52:18 [INFO] generating key: rsa-2048 2024/08/12 01:52:18 [INFO] encoded CSR 2024/08/12 01:52:18 [INFO] signed certificate with serial number 551191362201513999751984108198311988195553115643 2024/08/12 01:52:18 [WARNING] This certificate lacks a hosts field. This makes it unsuitable for websites. For more information see the Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org); specifically, section 10.2.3 (Information Requirements). [rootk8s-master1 crt]# echo $? 0 最终结果 [rootk8s-master1 crt]# ls *pem ca-key.pem ca.pem kube-proxy-key.pem kube-proxy.pem server-key.pem server.pem 4.4.2、部署api server组件 [rootk8s-master1 ~]# wget https://dl.k8s.io/v1.11.10/kubernetes-server-linux-amd64.tar.gz [rootk8s-master1 ~]# ls anaconda-ks.cfg etcd-v3.2.12-linux-amd64 kubernetes-server-linux-amd64.tar.gz cert etcd-v3.2.12-linux-amd64.tar.gz [rootk8s-master1 ~]# mkdir -p /opt/kubernetes/{bin,cfg,ssl}#接下来做的就是把这三个目录填满[rootk8s-master1 ~]# tar -zxvf kubernetes-server-linux-amd64.tar.gz [rootk8s-master1 ~]# cd kubernetes/server/bin [rootk8s-master1 bin]# cp kube-apiserver kube-scheduler kube-controller-manager kubectl /opt/kubernetes/bin/ [rootk8s-master1 bin]# cd /opt/crt/ [rootk8s-master1 crt]# cp server.pem server-key.pem ca.pem ca-key.pem /opt/kubernetes/ssl/ [rootk8s-master1 crt]# cd /opt/kubernetes/cfg/创建token文件 [rootk8s-master1 cfg]# vim token.csv [rootk8s-master1 cfg]# cat token.csv 674c457d4dcf2eefe4920d7dbb6b0ddc,kubelet-bootstrap,10001,system:kubelet-bootstrap创建apiserver配置文件 [rootk8s-master1 cfg]# vim kube-apiserver [rootk8s-master1 cfg]# cat kube-apiserver KUBE_APISERVER_OPTS--logtostderrtrue \ --v4 \ --etcd-servershttps://192.168.188.101:2379,https://192.168.188.102:2379,https://192.168.188.103:2379 \ --bind-address192.168.188.101 \ --secure-port6443 \ --advertise-address192.168.188.101 \ --allow-privilegedtrue \ --service-cluster-ip-range10.0.0.0/24 \ --enable-admission-pluginsNamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \ --authorization-modeRBAC,Node \ --enable-bootstrap-token-auth \ --token-auth-file/opt/kubernetes/cfg/token.csv \ --service-node-port-range30000-50000 \ --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 \ --etcd-cafile/opt/etcd/ssl/ca.pem \ --etcd-certfile/opt/etcd/ssl/server.pem \ --etcd-keyfile/opt/etcd/ssl/server-key.pem [rootk8s-master1 cfg]# api配置文件参数说明 参数说明 * --logtostderr 启用日志 * --v 日志等级 * --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 token文件 * --service-node-port-range Service Node类型默认分配端口范围 使用systemd管理api server [rootk8s-master1 cfg]# vim /usr/lib/systemd/system/kube-apiserver.service [rootk8s-master1 cfg]# cat /usr/lib/systemd/system/kube-apiserver.service [Unit] DescriptionKubernetes API Server Documentationhttps://github.com/kubernetes/kubernetes[Service] EnvironmentFile-/opt/kubernetes/cfg/kube-apiserver ExecStart/opt/kubernetes/bin/kube-apiserver $KUBE_APISERVER_OPTS Restarton-failure[Install] WantedBymulti-user.target启动api server [rootk8s-master1 cfg]# systemctl daemon-reload [rootk8s-master1 cfg]# systemctl enable kube-apiserver Created symlink from /etc/systemd/system/multi-user.target.wants/kube-apiserver.service to /usr/lib/systemd/system/kube-apiserver.service. [rootk8s-master1 cfg]# systemctl start kube-apiserver [rootk8s-master1 cfg]# systemctl status kube-apiserver 4.4.3、部署schduler组件 创建schduler配置文件 [rootk8s-master1 cfg]# pwd /opt/kubernetes/cfg [rootk8s-master1 cfg]# vim kube-scheduler [rootk8s-master1 cfg]# cat kube-scheduler KUBE_SCHEDULER_OPTS--logtostderrtrue \ --v4 \ --master127.0.0.1:8080 \ --leader-elect参数说明 参数说明 * --master 连接本地apiserver * --leader-elect 当该组件启动多个时自动选举HA systemd管理schduler组件 [rootk8s-master1 cfg]# vim /usr/lib/systemd/system/kube-scheduler.service [rootk8s-master1 cfg]# cat /usr/lib/systemd/system/kube-scheduler.service [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 启动scheduler [rootk8s-master1 cfg]# systemctl daemon-reload [rootk8s-master1 cfg]# systemctl enable kube-scheduler Created symlink from /etc/systemd/system/multi-user.target.wants/kube-scheduler.service to /usr/lib/systemd/system/kube-scheduler.service. [rootk8s-master1 cfg]# systemctl start kube-scheduler [rootk8s-master1 cfg]# systemctl status kube-scheduler 4.4.4、部署controller-manager组件 controller-manager组件属于rc 创建controller-manager配置文件 [rootk8s-master1 cfg]# pwd /opt/kubernetes/cfg [rootk8s-master1 cfg]# vim kube-controller-manager [rootk8s-master1 cfg]# cat kube-controller-manager KUBE_CONTROLLER_MANAGER_OPTS--logtostderrtrue \ --v4 \ --master127.0.0.1:8080 \ --leader-electtrue \ --address127.0.0.1 \ --service-cluster-ip-range10.0.0.0/24 \ --cluster-namekubernetes \ --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 systemd管理controller-manager [rootk8s-master1 cfg]# vim /usr/lib/systemd/system/kube-controller-manager.service [rootk8s-master1 cfg]# cat /usr/lib/systemd/system/kube-controller-manager.service [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启动 [rootk8s-master1 cfg]# systemctl daemon-reload [rootk8s-master1 cfg]# systemctl enable kube-controller-manager Created symlink from /etc/systemd/system/multi-user.target.wants/kube-controller-manager.service to /usr/lib/systemd/system/kube-controller-manager.service. [rootk8s-master1 cfg]# systemctl start kube-controller-manager [rootk8s-master1 cfg]# systemctl status kube-controller-manager.service4.4.5、master节点部署检查 rootk8s-master1 cfg]# /opt/kubernetes/bin/kubectl get cs NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-1 Healthy {health: true} etcd-0 Healthy {health: true} etcd-2 Healthy {health: true} [rootk8s-master1 cfg]# 4.5、在Node节点部署组件 Kubernetes 中的 TLS Bootstrapping 机制。简而言之 TLS 认证当 Kubernetes Master 的 API server 启用了 TLS 认证后所有通信必须使用有效的证书进行加密。kubelet 证书需求每个 Node 节点上的 kubelet 组件需要一个有效的证书才能与 API server 通信。证书签署的繁琐如果集群中的节点数量很多手动签发证书会变得非常繁琐。TLS Bootstrapping 机制为了简化证书管理kubelet 以低权限用户身份自动向 API server 申请证书。API server 会动态签发 kubelet 需要的证书。 总的来说TLS Bootstrapping 机制自动化了证书签发过程简化了节点加入集群的操作。 可以参照下图进行理解 4.5.1、生成证书 先添加kubctl命令 [rootk8s-master1 ~]# ln -s /opt/kubernetes/bin/kubectl /usr/bin/kubectl 将kubelet-bootstrap用户绑定到系统集群角色获得集群角色权限 [rootk8s-master1 ~]# ln -s /opt/kubernetes/bin/kubectl /usr/bin/kubectl [rootk8s-master1 ~]# kubectl create clusterrolebinding kubelet-bootstrap \--clusterrolesystem:node-bootstrapper \--userkubelet-bootstrap clusterrolebinding.rbac.authorization.k8s.io/kubelet-bootstrap created 创建kubeconfig文件这里尽量每做一步检查一下 指定api地址有负载均衡写负载均衡的和token [rootk8s-master1 ~]# cd /opt/crt/ [rootk8s-master1 crt]# KUBE_APISERVERhttps://192.168.188.101:6443 [rootk8s-master1 crt]# cat /opt/kubernetes/cfg/token.csv 674c457d4dcf2eefe4920d7dbb6b0ddc,kubelet-bootstrap,10001,system:kubelet-bootstrap [rootk8s-master1 crt]# BOOTSTRAP_TOKEN674c457d4dcf2eefe4920d7dbb6b0ddc初步设置指定证书文件ca证书嵌入指定api server初步生成bootstrap.kubeconfi文件 [rootk8s-master1 crt]# kubectl config set-cluster kubernetes \--certificate-authorityca.pem \--embed-certstrue \--server${KUBE_APISERVER} \--kubeconfigbootstrap.kubeconfig Cluster kubernetes set. [rootk8s-master1 crt]# echo $? 0设置bootstrap.kubeconfi文件添加/创建带有token的名为kubelet-bootstrap用户的凭据 [rootk8s-master1 crt]# kubectl config set-credentials kubelet-bootstrap \--token${BOOTSTRAP_TOKEN} \--kubeconfigbootstrap.kubeconfig User kubelet-bootstrap set. [rootk8s-master1 crt]# echo $? 0设置上下文参数指定关联的集群关联的用户将这些写入文件中 [rootk8s-master1 crt]# kubectl config set-context default \--clusterkubernetes \--userkubelet-bootstrap \--kubeconfigbootstrap.kubeconfig Context default created. [rootk8s-master1 crt]# echo $? 0将 kubectl 的当前上下文切换到名为 default 的上下文 [rootk8s-master1 crt]# kubectl config use-context default --kubeconfigbootstrap.kubeconfig Switched to context default. [rootk8s-master1 crt]# echo $? 0创建kube-proxy kubeconfig文件流程同上 [rootk8s-master1 crt]# kubectl config set-cluster kubernetes \--certificate-authorityca.pem \--embed-certstrue \--server${KUBE_APISERVER} \--kubeconfigkube-proxy.kubeconfig Cluster kubernetes set. [rootk8s-master1 crt]# echo $? 0 [rootk8s-master1 crt]# kubectl config set-credentials kube-proxy \--client-certificatekube-proxy.pem \--client-keykube-proxy-key.pem \--embed-certstrue \--kubeconfigkube-proxy.kubeconfig User kube-proxy set. [rootk8s-master1 crt]# echo $? 0 [rootk8s-master1 crt]# kubectl config set-context default \--clusterkubernetes \--userkube-proxy \--kubeconfigkube-proxy.kubeconfig Context default created. [rootk8s-master1 crt]# echo $? 0 [rootk8s-master1 crt]# kubectl config use-context default --kubeconfigkube-proxy.kubeconfig Switched to context default. [rootk8s-master1 crt]# echo $? 0查明文件并拷贝 [rootk8s-master1 crt]# ls *.kubeconfig bootstrap.kubeconfig kube-proxy.kubeconfig[rootk8s-master1 crt]# scp *.kubeconfig k8s-node1:/opt/kubernetes/cfg/[rootk8s-master1 crt]# scp *.kubeconfig k8s-node2:/opt/kubernetes/cfg/4.5.2、组件拷贝 [rootk8s-master1 ~]# ls anaconda-ks.cfg etcd-v3.2.12-linux-amd64 kubernetes cert etcd-v3.2.12-linux-amd64.tar.gz kubernetes-server-linux-amd64.tar.gz[rootk8s-master1 ~]# cd /root/kubernetes/server/bin[rootk8s-master1 bin]# scp kubelet kube-proxy k8s-node1:/opt/kubernetes/bin/[rootk8s-master1 bin]# scp kubelet kube-proxy k8s-node2:/opt/kubernetes/bin/4.5.3、在node节点创建kubelet配置文件 两个node节点操作 [rootk8s-node1 ~]# vim /opt/kubernetes/cfg/kubelet [rootk8s-node1 ~]# cat /opt/kubernetes/cfg/kubelet KUBELET_OPTS--logtostderrtrue \ --v4 \ --hostname-override192.168.188.102 \ --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.0[rootk8s-node1 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0node2同上记得改ip 参数说明 参数说明 * --hostname-override 在集群中显示的主机名 * --kubeconfig 指定kubeconfig文件位置会自动生成 * --bootstrap-kubeconfig 指定刚才生成的bootstrap.kubeconfig文件 * --cert-dir 颁发证书存放位置 * --pod-infra-container-image 管理Pod网络的镜像 其中/opt/kubernetes/cfg/kubelet.config配置文件也需要准备 两个节点操作 [rootk8s-node1 ~]# vim /opt/kubernetes/cfg/kubelet.config [rootk8s-node1 ~]# cat /opt/kubernetes/cfg/kubelet.config kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 address: 192.168.188.102 port: 10250 readOnlyPort: 10255 cgroupDriver: cgroupfs clusterDNS: [10.0.0.2] clusterDomain: cluster.local. failSwapOn: false authentication:anonymous:enabled: truewebhook:enabled: false添加证书路径 两个节点操作 [rootk8s-node1 ~]# mkdir -p /opt/kubernetes/ssl然后去master [rootk8s-master1 crt]# pwd /opt/crt [rootk8s-master1 crt]# scp *pem k8s-node1:/opt/kubernetes/ssl/ [rootk8s-master1 crt]# scp *pem k8s-node2:/opt/kubernetes/ssl/ systemd管理kubelet组件 两个node都要写 [rootk8s-node1 ~]# vim /usr/lib/systemd/system/kubelet.service [rootk8s-node1 ~]# cat /usr/lib/systemd/system/kubelet.service [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 启动kubelet 两个node节点都做 [rootk8s-node1 ~]# systemctl daemon-reload [rootk8s-node1 ~]# systemctl enable kubelet Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service. [rootk8s-node1 ~]# systemctl start kubelet 回到master节点查看 Kubernetes 集群中证书签名请求 [rootk8s-master1 crt]# kubectl get csr 可以看到两个请求处于pending在等待  在Master审批Node加入集群 [rootk8s-master1 crt]# kubectl get csr NAME AGE REQUESTOR CONDITION node-csr-MBaIp9yvC7i2rD4Mw1EWCmLG9484QfExbuWM0u1NIfw 1m kubelet-bootstrap Pending node-csr-ux_C9Cx-C432B6AJhPN-BCck78d38WLUbMR3unxt_AI 1m kubelet-bootstrap Pending[rootk8s-master1 crt]# kubectl certificate approve node-csr-MBaIp9yvC7i2rD4Mw1EWCmLG9484QfExbuWM0u1NIfw certificatesigningrequest.certificates.k8s.io/node-csr-MBaIp9yvC7i2rD4Mw1EWCmLG9484QfExbuWM0u1NIfw approved[rootk8s-master1 crt]# kubectl certificate approve node-csr-ux_C9Cx-C432B6AJhPN-BCck78d38WLUbMR3unxt_AI certificatesigningrequest.certificates.k8s.io/node-csr-ux_C9Cx-C432B6AJhPN-BCck78d38WLUbMR3unxt_AI approved[rootk8s-master1 crt]# kubectl get csr NAME AGE REQUESTOR CONDITION node-csr-MBaIp9yvC7i2rD4Mw1EWCmLG9484QfExbuWM0u1NIfw 7m kubelet-bootstrap Approved,Issued node-csr-ux_C9Cx-C432B6AJhPN-BCck78d38WLUbMR3unxt_AI 6m kubelet-bootstrap Approved,Issued [rootk8s-master1 crt]# 查看node状态 [rootk8s-master1 crt]# kubectl get node NAME STATUS ROLES AGE VERSION 192.168.188.102 Ready none 2m v1.11.10 192.168.188.103 Ready none 1m v1.11.10 [rootk8s-master1 crt]# kubectl get nodes NAME STATUS ROLES AGE VERSION 192.168.188.102 Ready none 3m v1.11.10 192.168.188.103 Ready none 2m v1.11.10 [rootk8s-master1 crt]# kubectl get no NAME STATUS ROLES AGE VERSION 192.168.188.102 Ready none 3m v1.11.10 192.168.188.103 Ready none 2m v1.11.104.5.4、部署kube-proxy组件 创建kube-proxy配置文件 两个node节点都做 [rootk8s-node1 ~]# vim /opt/kubernetes/cfg/kube-proxy [rootk8s-node1 ~]# cat /opt/kubernetes/cfg/kube-proxy KUBE_PROXY_OPTS--logtostderrtrue \ --v4 \ --hostname-override192.168.188.102 \ --cluster-cidr10.0.0.0/24 \ --kubeconfig/opt/kubernetes/cfg/kube-proxy.kubeconfigsystemd管理kube-proxy组件 两个node节点都做 [rootk8s-node1 ~]# vim /usr/lib/systemd/system/kube-proxy.service [rootk8s-node1 ~]# cat /usr/lib/systemd/system/kube-proxy.service [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 启动kube-proxy [rootk8s-node1 ~]# systemctl daemon-reload [rootk8s-node1 ~]# systemctl enable kube-proxy Created symlink from /etc/systemd/system/multi-user.target.wants/kube-proxy.service to /usr/lib/systemd/system/kube-proxy.service. [rootk8s-node1 ~]# systemctl start kube-proxy 4.6、部署完成检查 [rootk8s-master1 ~]# kubectl get node NAME STATUS ROLES AGE VERSION 192.168.188.102 Ready none 17m v1.11.10 192.168.188.103 Ready none 16m v1.11.10[rootk8s-master1 ~]# kubectl get cs NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-2 Healthy {health: true} etcd-1 Healthy {health: true} etcd-0 Healthy {health: true} 5、kubernetes部署kubeadm 与二进制部署不同kubeadm 部署的所有组件均以容器方式运行。kubeadm 自动创建容器和证书十分便捷但企业中通常使用二进制部署以便于日志排错处理。 kubeadm 部署 Kubernetes 的最低配置要求为 2 核 CPU 和 2 GB 内存。当前 Kubernetes 官网最新版本是 1.30但本演示使用的是企业中较常用的 1.19.1 版本。组件镜像和 kubeadm 版本需与 Kubernetes 版本保持一致同时也要注意docker的版本。 通常我们从阿里云下载镜像并重新打标签因为 kubeadm 初始化 Kubernetes 集群时只识别默认的官网镜像名称。尽管初始化时会自动拉取镜像我们可以选择不拉取但默认从官网拉取常常会失败。遇到镜像拉取失败时可以查看错误信息中的镜像全称。下文将展示完整的操作步骤。 实验环境 3台centos7,开启ssh登录关闭防火墙关闭selinux、设置静态ip、时间同步 提前配置主机名互相配置域名解析 5.1、安装docker 三台全部操作 #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 #sed -i sdownload.docker.commirrors.aliyun.com/docker-ce /etc/yum.repos.d/docker-ce.repo #yum makecache fast #yum install -y docker-ce-19.03.2 docker-ce-cli-19.03.2 containerd.io docker版本可以看一下网上对应表选择一个相近的版本 # docker -v Docker version 19.03.2, build 6a30dfc # systemctl start docker # systemctl enable dockerdocker加速及驱动配置 [rootk8s-master1 ~]# cat /etc/docker/daemon.json {registry-mirrors: [https://hub-mirror.c.163.com,https://docker.m.daocloud.io,https://ghcr.io,https://mirror.baidubce.com,https://docker.nju.edu.cn] }》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》1.22之后版本如下[rootk8s-master1 ~]# cat /etc/docker/daemon.json {registry-mirrors: [https://hub-mirror.c.163.com,https://docker.m.daocloud.io,https://ghcr.io,https://mirror.baidubce.com,https://docker.nju.edu.cn],exec-opts: [native.cgroupdriversystemd] } 1.22之后不改driver安装k8s会报错。 重启docker注意此处docker必须设置开机自启 [rootk8s-master1 ~]# systemctl daemon-reload ;systemctl restart docker5.2、关闭swap 三台都需要操作 # swapoff -a # vim /etc/fstab 把这行注释掉/dev/mapper/centos-swap swap swap defaults 0 0# free -mtotal used free shared buff/cache available Mem: 2827 248 1742 9 836 2414 Swap: 0 0 0 5.3、使用kubeadm部署Kubernetes 三台主机操作 [rootk8s-master1 ~]# vim /etc/yum.repos.d/kubernetes.repo [rootk8s-master1 ~]# cat /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/kubernetes/yum/doc/rpm-package-key.gpg这个位置因为官网同步原因可能会造成检查错误所以直接关掉即可 这里进行一步错误操作演示如何卸载错误版本 [rootk8s-master1 ~]# yum install -y kubelet kubeadm kubectl [rootk8s-master1 ~]# yum remove -y rpm -qa | grep -E kubeadm|kubectl|kubelet 正确的下载方式 三台主机操作 # yum install -y kubelet-1.19.1-0.x86_64 kubeadm-1.19.1-0.x86_64 kubectl-1.19.1-0.x86_64 ipvsadmipvsadm 用于设置pod转发规则 加载ipvs相关的内核模块 三台主机操作 # modprobe ip_vs modprobe ip_vs_rr modprobe ip_vs_wrr modprobe ip_vs_sh modprobe nf_conntrack_ipv4 modprobe br_netfilter # lsmod | grep ip_vs编辑文件添加开机自启 # echo modprobe ip_vs modprobe ip_vs_rr modprobe ip_vs_wrr modprobe ip_vs_sh modprobe nf_conntrack_ipv4 modprobe br_netfilter /etc/rc.local # chmod x /etc/rc.local 配置转发相关参数这里只是为了防止报错基本用不上 三台主机 # cat EOF /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 vm.swappiness0 EOF使配置生效 三台主机 # sysctl -p /etc/sysctl.d/k8s.conf # sysctl --system 配置启动kubelet所有节点 三个主机1.配置kubelet建立pod使用的pause镜像 查看docker的驱动 # docker info|grep Cgroup DriverCgroup Driver: cgroupfs # DOCKER_CGROUPScgroupfs # echo $DOCKER_CGROUPS cgroupfs2.配置kubelet的cgroups 这里使用官网的镜像pause版本不清楚随便写一个一会看报错信息修改# cat /etc/sysconfig/kubeletEOFKUBELET_EXTRA_ARGS--cgroup-drivercgroupfs --pod-infra-container-imagek8s.gcr.io/pause:3.2EOF# cat /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS--cgroup-drivercgroupfs --pod-infra-container-imagek8s.gcr.io/pause:3.2 阿里源pause cat /etc/sysconfig/kubeletEOF KUBELET_EXTRA_ARGS--cgroup-driver$DOCKER_CGROUPS --pod-infra-container-imageregistry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2 EOF 三个主机# systemctl daemon-reload # systemctl enable kubelet systemctl restart kubelet 此时会写入自启动成功但是启动失败因为api server还未初始化 Master节点初始化 master操作[rootk8s-master1 ~]# kubeadm init --kubernetes-versionv1.19.1 --pod-network-cidr10.244.0.0/16 --apiserver-advertise-address192.168.188.101 --ignore-preflight-errorsSwap--apiserver-advertise-address192.168.188.101 ---master的ip地址等待镜像拉取报错,时间很长 这里可以通过以下参数指定镜像拉取地址 --image-repositoryregistry.aliyuncs.com/google_containers这种方法有概率失败建议手动拉 报错信息如下根据信息查看需要的镜像版本 重置初始化环境 [rootk8s-master1 ~]# kubeadm reset 根据所需镜像编写手动拉取脚本 编写所需镜像列表 [rootk8s-master1 ~]# vim images_need.sh [rootk8s-master1 ~]# cat images_need.sh k8s.gcr.io/kube-apiserver:v1.19.1 k8s.gcr.io/kube-controller-manager:v1.19.1 k8s.gcr.io/kube-scheduler:v1.19.1 k8s.gcr.io/kube-proxy:v1.19.1 k8s.gcr.io/pause:3.2 k8s.gcr.io/etcd:3.4.13-0 k8s.gcr.io/coredns:1.7.0根据上表将地址改为阿里云拉取 [rootk8s-master1 ~]# vim images_pull.sh [rootk8s-master1 ~]# cat images_pull.sh #!/bin/bash docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.19.1 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.19.1 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.19.1 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.19.1 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2将上面拉取的镜像通过tag改为所需镜像 [rootk8s-master1 ~]# vim images_tag.sh [rootk8s-master1 ~]# cat images_tag.sh #!/bin/bash docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.19.1 k8s.gcr.io/kube-controller-manager:v1.19.1 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.19.1 k8s.gcr.io/kube-proxy:v1.19.1 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.19.1 k8s.gcr.io/kube-apiserver:v1.19.1 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.19.1 k8s.gcr.io/kube-scheduler:v1.19.1 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0 k8s.gcr.io/coredns:1.7.0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2 将脚本拷贝到每个节点 [rootk8s-master1 ~]# scp *.sh k8s-node1:/root/ [rootk8s-master1 ~]# scp *.sh k8s-node2:/root/node加入集群也可以自动获取 开始获取镜像 三台主机 [rootk8s-master1 ~]# bash images_pull.sh [rootk8s-master1 ~]# bash images_tag.sh [rootk8s-master1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE k8s.gcr.io/kube-proxy v1.19.1 33c60812eab8 3 years ago 118MB registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy v1.19.1 33c60812eab8 3 years ago 118MB k8s.gcr.io/kube-apiserver v1.19.1 ce0df89806bb 3 years ago 119MB registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver v1.19.1 ce0df89806bb 3 years ago 119MB k8s.gcr.io/kube-controller-manager v1.19.1 538929063f23 3 years ago 111MB registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager v1.19.1 538929063f23 3 years ago 111MB registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler v1.19.1 49eb8a235d05 3 years ago 45.7MB k8s.gcr.io/kube-scheduler v1.19.1 49eb8a235d05 3 years ago 45.7MB registry.cn-hangzhou.aliyuncs.com/google_containers/etcd 3.4.13-0 0369cf4303ff 3 years ago 253MB k8s.gcr.io/etcd 3.4.13-0 0369cf4303ff 3 years ago 253MB k8s.gcr.io/coredns 1.7.0 bfe3a36ebd25 4 years ago 45.2MB registry.cn-hangzhou.aliyuncs.com/google_containers/coredns 1.7.0 bfe3a36ebd25 4 years ago 45.2MB k8s.gcr.io/pause 3.2 80d28bedfe5d 4 years ago 683kB registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.2 80d28bedfe5d 4 years ago 683kB镜像获取后再次进行初始化 master上操作[rootk8s-master1 ~]# kubeadm init --kubernetes-versionv1.19.1 --pod-network-cidr10.244.0.0/16 --apiserver-advertise-address192.168.188.101 --ignore-preflight-errorsSwap初始化成功后根据提示信息操作这里运行成功后会产生一条命令记录下来找个地方保存好一会要用 kubeadm join 192.168.188.101:6443 --token 5237e5.qk4mviyycbpcnixb \--discovery-token-ca-cert-hash sha256:fd4151d272b6b8e7587b6afb161c087e4cd85e55bd82a816ffc751ddac040241 token默认只有24个小时如果过期了或者忘了可以重新获取加入集群的命令 kubeadm token create --print-join-command kubeadm初始化后提示信息 此时docker ps查看master上容器可以看到组件以容器形式运行 根据初始化产生的信息操作 master上操作[rootk8s-master1 ~]# mkdir -p $HOME/.kube [rootk8s-master1 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [rootk8s-master1 ~]# chown $(id -u):$(id -g) $HOME/.kube/config [rootk8s-master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master1 NotReady master 18m v1.19.1此时master节点状态为未准备原因是网络插件尚未启动[rootk8s-master1 ~]# kubectl get pod No resources found in default namespace. 在默认的命名空间下没有pod这里指定命名空间可以看到两个Pending的dns-pod同时此时没有flannel pod [rootk8s-master1 ~]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE coredns-f9fd979d6-2xktj 0/1 Pending 0 22m coredns-f9fd979d6-x7bkv 0/1 Pending 0 22m etcd-k8s-master1 1/1 Running 0 22m kube-apiserver-k8s-master1 1/1 Running 0 22m kube-controller-manager-k8s-master1 1/1 Running 0 22m kube-proxy-bprpg 1/1 Running 0 22m kube-scheduler-k8s-master1 1/1 Running 0 22m配置使用网络插件 通过编写yaml文件创建flannel pod这个文件放在文章开始的百度云链接里面了建议保存一份没有科学上网环境下载很不方便有科学上网环境建议选择HK节点 curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 使用vim冒号命令进行替换 :% s/namespace: kube-flannel/namespace: kube-system/gpod尽量创建到同一个命名空间 保证网段和初始化时候一样 添加宿主机网卡 添加如下内容忽略notready状态仍然部署pod - key: node.kubernetes.io/not-readyoperator: Existseffect: NoSchedule 保存退出后查看yaml文件所需镜像提前下载 三台执行 [rootk8s-master1 ~]# grep image kube-flannel.yml image: docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1image: docker.io/flannel/flannel:v0.25.5image: docker.io/flannel/flannel:v0.25.5 [rootk8s-master1 ~]# docker pull docker.io/flannel/flannel:v0.25.5 [rootk8s-master1 ~]# docker pull docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1这个镜像拉取时候大概率报错而且多重复几次你会发现报错都不一样解决方法 [rootk8s-master1 ~]# docker pull registry.cn-chengdu.aliyuncs.com/k8s_module_images/flannel-cni-plugin:v1.5.1-flannel1 [rootk8s-master1 ~]# docker pull registry.cn-chengdu.aliyuncs.com/k8s_module_images/flannel:v0.25.5 [rootk8s-master1 ~]# docker tag registry.cn-chengdu.aliyuncs.com/k8s_module_images/flannel:v0.25.5 docker.io/flannel/flannel:v0.25.5 [rootk8s-master1 ~]# docker tag registry.cn-chengdu.aliyuncs.com/k8s_module_images/flannel-cni-plugin:v1.5.1-flannel1 docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1 这里读取配置文件 [rootk8s-master1 ~]# mv kube-flannel.yml kube-flannel.yaml [rootk8s-master1 ~]# kubectl apply -f kube-flannel.yaml namespace/kube-flannel created clusterrole.rbac.authorization.k8s.io/flannel created clusterrolebinding.rbac.authorization.k8s.io/flannel created serviceaccount/flannel created configmap/kube-flannel-cfg created daemonset.apps/kube-flannel-ds created 再次查看podflannel pod应该有三个但是现在node还没有加入这里只有一个 [rootk8s-master1 ~]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE coredns-f9fd979d6-f8rxv 1/1 Running 0 6m25s coredns-f9fd979d6-frrvc 1/1 Running 0 6m25s etcd-k8s-master1 1/1 Running 0 6m42s kube-apiserver-k8s-master1 1/1 Running 0 6m41s kube-controller-manager-k8s-master1 1/1 Running 0 6m42s kube-flannel-ds-c576q 1/1 Running 0 2m20s kube-proxy-96cnh 1/1 Running 0 6m25s kube-scheduler-k8s-master1 1/1 Running 0 6m42s[rootk8s-master1 ~]# kubectl get pod -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES coredns-f9fd979d6-f8rxv 1/1 Running 0 10m 10.244.0.2 k8s-master1 none none coredns-f9fd979d6-frrvc 1/1 Running 0 10m 10.244.0.3 k8s-master1 none none etcd-k8s-master1 1/1 Running 0 10m 192.168.188.101 k8s-master1 none none kube-apiserver-k8s-master1 1/1 Running 0 10m 192.168.188.101 k8s-master1 none none kube-controller-manager-k8s-master1 1/1 Running 0 10m 192.168.188.101 k8s-master1 none none kube-flannel-ds-c576q 1/1 Running 0 6m28s 192.168.188.101 k8s-master1 none none kube-proxy-96cnh 1/1 Running 0 10m 192.168.188.101 k8s-master1 none none kube-scheduler-k8s-master1 1/1 Running 0 10m 192.168.188.101 k8s-master1 none none将前面初始化生成的命令放在node上执行然后回到master节点检查 [rootk8s-master1 ~]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master1 Ready master 18m v1.19.1 k8s-node1 Ready none 3m v1.19.1 k8s-node2 Ready none 61s v1.19.1 5.4、常用命令 [rootk8s-master1 ~]# kubectl describe node k8s-node1 查看详细信息 [rootk8s-master1 ~]# systemctl status kubelet -l 查看报错[rootk8s-master1 ~]# kubeadm token create 创建新token [rootk8s-master1 ~]# kubeadm token list 查看token列表 [rootk8s-master1 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2/dev/null | openssl dgst -sha256 -hex | sed s/^.* // 获取哈希值 可用来后期新增node节点[rootk8s-master1 ~]# kubectl drain kub-k8s-node1 --delete-local-data --force --ignore-daemonsets 驱离k8s-node-1节点上的pod [rootk8s-master1 ~]# kubectl delete node k8s-node1 删除节点 [rootk8s-node1 ~]# kubeadm reset 重置node1节点
文章转载自:
http://www.morning.zqbrd.cn.gov.cn.zqbrd.cn
http://www.morning.tbcfj.cn.gov.cn.tbcfj.cn
http://www.morning.qytpt.cn.gov.cn.qytpt.cn
http://www.morning.rnyhx.cn.gov.cn.rnyhx.cn
http://www.morning.pfgln.cn.gov.cn.pfgln.cn
http://www.morning.mxftp.com.gov.cn.mxftp.com
http://www.morning.pcbfl.cn.gov.cn.pcbfl.cn
http://www.morning.csdgt.cn.gov.cn.csdgt.cn
http://www.morning.xdmsq.cn.gov.cn.xdmsq.cn
http://www.morning.tnyanzou.com.gov.cn.tnyanzou.com
http://www.morning.bnpcq.cn.gov.cn.bnpcq.cn
http://www.morning.fkflc.cn.gov.cn.fkflc.cn
http://www.morning.uqrphxm.cn.gov.cn.uqrphxm.cn
http://www.morning.qfwzm.cn.gov.cn.qfwzm.cn
http://www.morning.bpmnh.cn.gov.cn.bpmnh.cn
http://www.morning.drspc.cn.gov.cn.drspc.cn
http://www.morning.ghgck.cn.gov.cn.ghgck.cn
http://www.morning.qbtkg.cn.gov.cn.qbtkg.cn
http://www.morning.qineryuyin.com.gov.cn.qineryuyin.com
http://www.morning.rrcrs.cn.gov.cn.rrcrs.cn
http://www.morning.wjwfj.cn.gov.cn.wjwfj.cn
http://www.morning.mbmh.cn.gov.cn.mbmh.cn
http://www.morning.llqky.cn.gov.cn.llqky.cn
http://www.morning.fkgct.cn.gov.cn.fkgct.cn
http://www.morning.hqbnx.cn.gov.cn.hqbnx.cn
http://www.morning.hrpjx.cn.gov.cn.hrpjx.cn
http://www.morning.qbksx.cn.gov.cn.qbksx.cn
http://www.morning.lmnbp.cn.gov.cn.lmnbp.cn
http://www.morning.mypxm.com.gov.cn.mypxm.com
http://www.morning.lxhny.cn.gov.cn.lxhny.cn
http://www.morning.yqmmh.cn.gov.cn.yqmmh.cn
http://www.morning.qgghr.cn.gov.cn.qgghr.cn
http://www.morning.nba1on1.com.gov.cn.nba1on1.com
http://www.morning.nclps.cn.gov.cn.nclps.cn
http://www.morning.spkw.cn.gov.cn.spkw.cn
http://www.morning.bynf.cn.gov.cn.bynf.cn
http://www.morning.yrpd.cn.gov.cn.yrpd.cn
http://www.morning.wtnwf.cn.gov.cn.wtnwf.cn
http://www.morning.pjxw.cn.gov.cn.pjxw.cn
http://www.morning.gmgnp.cn.gov.cn.gmgnp.cn
http://www.morning.bpptt.cn.gov.cn.bpptt.cn
http://www.morning.ghrhb.cn.gov.cn.ghrhb.cn
http://www.morning.xtqr.cn.gov.cn.xtqr.cn
http://www.morning.lpnb.cn.gov.cn.lpnb.cn
http://www.morning.zbjfq.cn.gov.cn.zbjfq.cn
http://www.morning.khpx.cn.gov.cn.khpx.cn
http://www.morning.bpmfr.cn.gov.cn.bpmfr.cn
http://www.morning.cgntj.cn.gov.cn.cgntj.cn
http://www.morning.rwbx.cn.gov.cn.rwbx.cn
http://www.morning.ltrms.cn.gov.cn.ltrms.cn
http://www.morning.zhiheliuxue.com.gov.cn.zhiheliuxue.com
http://www.morning.xrnh.cn.gov.cn.xrnh.cn
http://www.morning.nxfuke.com.gov.cn.nxfuke.com
http://www.morning.dkgtr.cn.gov.cn.dkgtr.cn
http://www.morning.ddzqx.cn.gov.cn.ddzqx.cn
http://www.morning.iknty.cn.gov.cn.iknty.cn
http://www.morning.skwwj.cn.gov.cn.skwwj.cn
http://www.morning.pbxkk.cn.gov.cn.pbxkk.cn
http://www.morning.dxpzt.cn.gov.cn.dxpzt.cn
http://www.morning.xwlmr.cn.gov.cn.xwlmr.cn
http://www.morning.drfrm.cn.gov.cn.drfrm.cn
http://www.morning.mftdq.cn.gov.cn.mftdq.cn
http://www.morning.jklns.cn.gov.cn.jklns.cn
http://www.morning.mxdhy.cn.gov.cn.mxdhy.cn
http://www.morning.ljdtn.cn.gov.cn.ljdtn.cn
http://www.morning.fyglr.cn.gov.cn.fyglr.cn
http://www.morning.jgzmr.cn.gov.cn.jgzmr.cn
http://www.morning.zbqsg.cn.gov.cn.zbqsg.cn
http://www.morning.nkhdt.cn.gov.cn.nkhdt.cn
http://www.morning.gyqnc.cn.gov.cn.gyqnc.cn
http://www.morning.dwmmf.cn.gov.cn.dwmmf.cn
http://www.morning.psdbf.cn.gov.cn.psdbf.cn
http://www.morning.lyjwb.cn.gov.cn.lyjwb.cn
http://www.morning.c7495.cn.gov.cn.c7495.cn
http://www.morning.080203.cn.gov.cn.080203.cn
http://www.morning.cbvlus.cn.gov.cn.cbvlus.cn
http://www.morning.fzqfb.cn.gov.cn.fzqfb.cn
http://www.morning.qygfb.cn.gov.cn.qygfb.cn
http://www.morning.crdtx.cn.gov.cn.crdtx.cn
http://www.morning.lqjpb.cn.gov.cn.lqjpb.cn
http://www.tj-hxxt.cn/news/248604.html

相关文章:

  • 崂山网站建设wordpress 文章推荐插件
  • 网站倒计时重庆网站建设找重庆最佳科技
  • 怎么建立企业网站有没有一些网站可以做问卷
  • 长春建站价格适合vue做的网站类型
  • 新公司怎么建立自己的网站本地佛山顺德网站设计
  • 网站建设案例包括哪些济南招考院网站
  • 网站改版html营销网站手机站
  • 溧阳常州做网站人工智能在未来可以
  • 学校的网站怎么做的泉州seo网站关键词优
  • 中文个人网站模板下载wordpress翻转框
  • 网站建设费用什么意思衡水seo网站建设优化排名
  • 网站做1920px好吗36氪国外做网站
  • 南宁公司做网站wordpress手机端粘性菜单
  • 网站界面设计内容网站建设一条龙怎么样
  • 论坛网站建设用工具软件企业网络推广的方法有哪些
  • 什么叫宣传型网站生成logo的网站
  • wordpress微信插件开发如何优化网页加载速度
  • p2p网站建设cms网站建设经营服务合同范本
  • 网站如何在360做提交wordpress设置静态
  • 大足网站设计原网站开发新功能
  • 网站上传 文件夹结构东莞企业网站教程
  • 建什么网站可以赚钱小程序如何搭建
  • 企业网站搭建多少钱重庆建筑培训网
  • php做的网站怎么调试wordpress全球销量主题
  • 网站制作与管理技术...深圳高端家装公司
  • 做虚假彩票网站判几年怎样创造一个网站
  • 建设网站要求唐山网站关键词优化
  • php成品网站超市化妆品网站栏目设计
  • ps做汽车网站下载石家庄网站开发公司
  • 中国建设银行江西分行网站首页展架设计制作图片