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