① k8s cronjob 启动顺序
k8s cronjob 启动顺序如下:在K8S部署中,有时候容器启动顺序因为我们业务需要是有要求的,比如业务服务可能需要在 配置中心、注册的中心 启动后才启动。通过 initContainer 来阻塞启动,如下以业务服务需要在apollo配置中心启动后才启动需求为例:my-namespace为配置中心所在命名空间的名称。svc.cluster.local为固定写法。6166为我的配置中心的端口号。/info为配置中心启动后可以正常访问的一个URL地址,这个根据你自己实际需求填写,比如 /actuator/metrics 等等。
② k8s-pod-初探2
踩坑完毕,回到主线。
前面关于port的理解存在偏差,需要用实验来确认port配置的含义。
k8s官方文档对于对于这些配置项的解释还是没有很完善。下面是在其他博文中找到的解释。
已知:
从k8s集群内部的宿主机(物理机、虚拟机)可以直接访问pod的服务地址 ip:80
未知(需要测试):
1、同一局域网内,但没有加入k8s集群的其他服务器能否访问pod的服务地址 ip:80—无法访问
2、能否跳过pod直接访问容器的服务地址 ip:80—没查到ip
首先要知道容器的IP地址
可以看到上面的命令查出的结果是 – 无法看出ip,尝试进入容器查看
然后我就没辙了,不过根据linux系统的精神,所有内容都是文件,但是我google了好久也没找到ip地址到底存在哪一个文件中。然后我就怀疑是不是一定要容器开放端口,ip地址才可以用docker inspect查询,起了一个不开端口的容器,结果也是有ip的。后来问了一个底层开发的朋友,据说ip是不写文件的。
那只能先认为通过k8s启动的容器其实是没有容器ip的。
从侧面看,也很有可能k8s启动的容器确实没有ip
3、访问pod所在的主机的80端口能否返回相同的响应—无法访问
从以上的信息来看,这个port配置应该和docker中暴露端口的意思是一样的,例如下面的例子
来做一下实验:
在我们之前的pod配置文件上增加配置,如下
结果和我们之前的猜测保持一致,增加ports的配置之后,访问宿主机的ip:80也可以访问到pod的内容了。
我这里pod ip 是 10.19.130.67,宿主机是 10.100.1.237。curl 10.19.130.67 和 curl 10.100.1.237 得到的结果是一样的。正当我想再仔细看看的时候,服务器又挂了,wc,只能明天找网管重启了。
—第二天
昨天,我还想看看
1、关了这个pod之后是否就不能访问了
启动了2个pod如下,mynginx1没有配置ports,mynginx2配置了ports。
当我关了pod-mynginx2之后访问宿主机10.100.2.167应该就不能通了,结果居然是—能访问到!
大吃一惊!结果ip弄错了,宿主机不是10.100.2.167,而是10.100.1.237,犯了个低级错误。
结果如下:这回和预期的结果终于一样了。
2、宿主机上是不是本身就开启了nginx,所以恰巧就能访问
确认宿主机上没有开启nginx
3、宿主机上的端口开放情况
使用netstat查看宿主机的端口开放,居然没有发现80端口开着,好奇怪。
那如果在10.100.1.237宿主机上启动一个nginx端口开在80,结果会是什么样子呢。
我居然启动了,没有端口已被占用的报错。现在把宿主机上的nginx的index页面的内容改一下,看访问10.100.1.237:80时,到底访问的是哪一个nginx。
分别从集群内部3台服务器和集群外部1台服务器的机器取访问10.100.1.237:80,访问到的都是pod中的nginx。
会不会跟启动顺序有关,因为现在的情况是先启动了pod-nignx,后启动 宿主机-nginx,那现在将pod-nginx关闭,访问10.100.1.237:80,看是啥。
集群内部3台服务器和集群外部1台服务器访问10.100.1.237:80,结果一致,都是宿主机-nginx。
再启动pod-nginx,查看结果。
访问结果又变回pod-nginx了,4台服务器结果一致。
再去看一下宿主机-nginx的日志,有没有报错信息———–没有错误日志
现在基本可以得出结论了:当pod和宿主机同时使用某一个端口时,不会因为冲突而报错,但是pod会优先占用端口,而与启动顺序无关。
至于为什么会这样,就不去深究了,毕竟精力有限,作为运维实施,了解到这样子的程度应该够用了。
③ K8S安装和创建集群终极教程(单master多worker)
本文会以 最简单 、 最直接 、 最完整 的方式记录kubernetes(下面统称K8S)单master多工作节点(worker nodes)的集群步骤
首先要简单了解一下本文的3个核心概念:
内存建议至少4G
问:如何查看主机名?
答:执行命令hostname
问:如何修改主机名?
答:永久生效的做法:执行命令vi /etc/hostname,把第一行去掉(不能注释掉,要去掉),然后重新写上自定义的主机名(注意命名规范),保存并重启后生效;
临时生效的做法:执行以下命令
问:如何查看MAC地址?
答:执行命令ip link,然后看你的第一网卡
问:如何查看proct_uuid?
答:执行命令sudo cat /sys/class/dmi/id/proct_uuid
注意:30000-32767这个端口范围是我们创建服务的端口必须要设置的一个范围(如果设置范围以外的会有限制提示并创建失败),这是K8S规定的。
另外,如果你要直接关闭防火墙可以执行
⑥必须禁用Swap
Swap total大于0,说明Swap分区是开启的
问:如何关闭Swap?
答:编辑文件/etc/fstab,在swap行前面加上#号注释, 保存并重启服务器
再次查看分区状态,已生效
常见的容器引擎(Container runtime,简称runtime):
本文使用的容器引擎是Docker
安装完成后查看版本:
当出现可能跟Docker引擎相关的奇怪异常时可以尝试把Docker卸载干净并重新安装,但一定要注意镜像、容器、卷或配置文件这些是否需要备份。
下面记录卸载Docker引擎的步骤:
①卸载 Docker Engine、CLI 和 Containerd 包:
②主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷:
③配置文件如果有不合法的字符时会导致启动失败,我们需要将其删除然后重建
此时Docker引擎已卸载干净
官网用的是谷歌的yum源,因为国内是连不上的,所以这里替换成阿里提供的yum源
①安装
从安装信息中可以看到版本号是1.22
Installing:
kubeadm x86_64 1.22.4-0 kubernetes 9.3 M
kubectl x86_64 1.22.4-0 kubernetes 9.7 M
kubelet x86_64 1.22.4-0 kubernetes 20 M
②启动
这就是一个驱动程序,注意cgroup和cgroupfs不要混淆了
引用官方的一段话
“由于 kubeadm 把 kubelet 视为一个系统服务来管理,所以对基于 kubeadm 的安装, 我们推荐使用 systemd 驱动,不推荐 cgroupfs 驱动。”
kubeadm默认是使用systemd 驱动,而我们的Docker默认驱动是cgroupfs(docker info可以查看),所以需要将Docker的驱动改成systemd
①编辑Docker配置文件
②重启Docker服务
再次docker info查看驱动信息已变成了systemd
工作节点(worker nodes)的最小配置就到这里了
①镜像源参数说明
默认情况下, kubeadm 会从 k8s.gcr.io 仓库拉取镜像,国内是拉不了的。官方文档明确表示允许你使用其他的 imageRepository 来代替 k8s.gcr.io。
–image-repository 你的镜像仓库地址
接下来我找了一些国内的镜像源,并简单做了下分析
综合上述统计,我选择阿里云的镜像源
②ip地址范围参数说明
–pod-network-cidr =192.168.0.0/16
注意:如果192.168.0.0/16已经在您的网络中使用,您必须选择一个不同的pod网络CIDR,在上面的命令中替换192.168.0.0/16。
集群初始化命令:
因为我用的是演示机器,所以这里把完整的执行信息都贴出来方便查阅,平时工作中一定要注意保护好敏感的信息(我的ip地址范围是自定义的便于下面的功能演示,另外初次init需要下载镜像文件,一般需要等几分钟)
如上所示,集群初始化成功,此时一定要注意看上面执行结果最后的那部分操作提示,我已用标明了初始化成功后还需要执行的3个步骤
注意:如果init成功后发现参数需要调整,可以执行kubeadm reset,它的作用是尽最大努力恢复kubeadm init 或者 kubeadm join所做的更改。
To start using your cluster, you need to run the following as a regular user:
翻译:开始使用集群前,如果你是普通用户(非root),你需要执行以下的命令:
Alternatively, if you are the root user, you can run:
翻译:或者,如果你使用的是root,你可以执行以下命令:
(注意:export只是临时生效,意味着每次登录你都需要执行一次)
网络配置配的就是Pod的网络,我的网络插件选用calico
cidr就是ip地址范围,如果您使用 pod CIDR 192.168.0.0/16,请跳到下一步。
但本文中使用的pod CIDR是192.100.0.0/16,所以我需要取消对清单中的 CALICO_IPV4POOL_CIDR 变量的注释,并将其设置为与我选择的 pod CIDR 相同的值。(注意一定要注意好格式,注意对齐)
可根据需求自定义清单,一般不需要的就直接跳过这步
在所有的工作节点上执行join命令(复制之前初始化成功后返回的加入集群命令到所有的工作节点执行即可)
master上查看所有节点的状态
到这里集群已经创建完成
最后我再安装K8S的可视化界面kubernetes-dashboard,方便我们日常使用
①下载yaml文件
②修改yaml文件,新增type和nodePort,使服务能够被外部访问
③安装并查看运行情况
④新建用户
文件创建完成后保存并apply
⑤获取Token,用于界面登录
⑥登录dashboard
192.168.189.128是我的master服务器ip,另外要注意必须使用https,并且不能使用ie内核模式
复制⑤生成的token到输入框,点击登录
dashboard安装配置完成
问:如何在查看资源情况?
答:在master上执行以下命令可查看资源情况(-o wide是显示更详细的信息),
①查看所有节点
②查看所有命名空间
③查看命名空间下的pod
④查看所有命名空间的pod
⑤实时查看查看命名空间下的pod运行情况
问:kubeadm join 出现异常[ERROR Port-10250]: Port 10250 is in use,如何解决?
答:这是因为你之前join失败过了,需要先执行kubeadm reset再重新join
问:虚拟机上测试时网卡突然消失如何解决(题外问题记录)?
答:
①确认丢失的网卡信息,ens开头(可选步骤)
ifconfig -a
②执行以下命令解决
问:如何查看K8S版本?
答:kubectl version
问:join命令忘记或者过期了怎么办?
答:
生成永不过期的
生成时效24小时的
问:Pod不断重启并且无其它报错信息时怎么办?
答:这种情况通常是因为你的集群中只有master,没有worker节点,master的创建默认是有污点的,即不允许调度新的Pod,如果你需要(当然这并不推荐),就需要删除 master 上的污点。删除污点可以执行以下命令,
它应该返回以下内容。
④ 超全K8s集群构建指南,建议收藏
1. 什么是kubernetes Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
2. kubernetes核心组件说明 Kubernetes 集群中主要存在两种类型的节点,分别是 master 节点 ,以及 minion 节点 。
Minion 节点是实际运行 Docker 容器的节点,负责和节点上运行的 Docker 进行交互,并且提供了代理功能。
Master 节点负责对外提供一系列管理集群的 API 接口,并且通过和 Minion 节点交互来实现对集群的操作管理。
apiserver :用户和 kubernetes 集群交互的入口,封装了核心对象的增删改查操作,提供了 RESTFul 风格的 API 接口,通过 etcd 来实现持久化并维护对象的一致性。
scheler :负责集群资源的调度和管理,例如当有 pod 异常退出需要重新分配机器时,scheler 通过一定的调度算法从而找到最合适的节点。
controller-manager :主要是用于保证 replicationController 定义的复制数量和实际运行的 pod 数量一致,另外还保证了从 service 到 pod 的映射关系总是最新的。
kubelet :运行在 minion 节点,负责和节点上的 Docker 交互,例如启停容器,监控运行状态等。
proxy :运行在 minion 节点,负责为 pod 提供代理功能,会定期从 etcd 获取 service 信息,并根据 service 信息通过修改 iptables 来实现流量转发(最初的版本是直接通过程序提供转发功能,效率较低。),将流量转发到要访问的 pod 所在的节点上去。
etcd :key-value键值存储数据库,用来存储kubernetes的信息的。
flannel :Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,需要另外下载部署。
我们知道当我们启动 Docker 后会有一个用于和容器进行交互的 IP 地址,如果不去管理的话可能这个 IP 地址在各个机器上是一样的,并且仅限于在本机上进行通信,无法访问到其他机器上的 Docker 容器。
Flannel 的目的就是为集群中的所有节点重新规划 IP 地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的 IP 地址,并让属于不同节点上的容器能够直接通过内网 IP 通信。
3. Kubernetes的核心概念
Pod 运行于Node节点上,若干相关容器的组合。Pod内包含的容器运行在同一宿主机上,使用相同的网络命名空间、IP地址和端口,能够通过localhost进行通。
Pod是Kurbernetes进行创建、调度和管理的最小单位,它提供了比容器更高层次的抽象,使得部署和管理更加灵活。一个Pod可以包含一个容器或者多个相关容器。
Replication Controller Replication Controller用来管理Pod的副本,保证集群中存在指定数量的Pod副本。
集群中副本的数量大于指定数量,则会停止指定数量之外的多余容器数量,反之,则会启动少于指定数量个数的容器,保证数量不变。
Replication Controller是实现弹性伸缩、动态扩容和滚动升级的核心。
Service Service定义了Pod的逻辑集合和访问该集合的策略,是真实服务的抽象。
Service提供了一个统一的服务访问入口以及服务代理和发现机制,用户不需要了解后台Pod是如何运行。
Label Kubernetes中的任意API对象都是通过Label进行标识,Label的实质是一系列的K/V键值对。Label是Replication Controller和Service运行的基础,二者通过Label来进行关联Node上运行的Pod。
Node Node是Kubernetes集群架构中运行Pod的服务节点(或agent)。
Node是Kubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。
4. 前置条件设置 三台Centos7系统的虚拟机(1个master+2个node),三台机器上的防火墙,SELINUX全部关掉。我的实验坏境可以上网,默认的YUM源就可以用。
5. 部署规划 192.168.10.1 # master节点(etcd,kubernetes-master) 192.168.10.2 # node1节点(etcd,kubernetes-node,docker,flannel) 192.168.10.3 # node2节点(etcd,kubernetes-node,docker,flannel)
6. 开始安装
step1:在master上安装 yum install kubernetes-master etcd flannel -y
step2:在node上安装 yum install kubernetes-node etcd flannel -y
step3:etcd集群配置 在master节点上编辑etcd配置文件
在node1节点上编辑etcd配置文件
在node2节点上编辑etcd配置文件
到此etcd集群就部署完了,然后每个节点上启动 systemctl start etcd
step4:验证
step6:启动Master上的三个服务
step7:kubernetes node安装
node2 节点重复上述操作 step8:分别启动kubernetes node服务
7. 网络配置 因为kubernetes集群中网络部分是插件形式安装的,我们这里选用flannel 上述安装步骤已经install 了
为flannel创建分配的网络
8. 执行kubectl 命令检查 在master上执行下面,检查kubernetes的状态
9. 常用排错命令如下
⑤ K8s 集群搭建系列(三)K8s 启动
到目前为止,通用的配置我们已经准备好了,剩下的步骤要分为两部分进行,一个是控制平面的搭建,一个是从工作节点的搭建。由于我们目前只有一台虚拟机,如果要从头开始搭建工作节点,那么就太麻烦了。我们关机利用 VMware 克隆出(完整克隆)另一台机器来。还有一点需要注意的是,因为是完整克隆,所以 ip 地址也一并克隆了下来,所以我们一定要记得修改工作节点的 ip 地址。
至此,控制平面完成,我们开始准备工作节点。
集群到此已经搭建完成了,我们可以在控制平面查看节点信息
细心的话,你会发现 node-1 对应的 ROLES 为 <none>,我们可以为它分配个角色
K8s 的搭建目前已经全部完毕了,如果对 Istio 感兴趣的话,可以关注 【K8s 集群搭建系列(四)你好 Istio】 。
⑥ K8S 网络详解 3 CNI 与 CNM 网络模型
CNM 模型主要通过 Network Sanbox , Endpoint 和 Network 这三个朱建进行实现 CNI 的规范比较小巧。它规定了一个容器runtime和网络插件之间的简单的契约。这个契约通过jsON的语法定义了CNI插件所需要提供的输入和输出。 一个容器可以被加入到被不同插件所驱动的多个网络之中。一个网络有自己对应的插件和唯一的名称。CNI 插件需要提供两个命令:一个用来将网络接口加入到指定网络,另一个用来将其移除。这两个接口分别在容器被创建和销毁的时候被调用。 CNI 模型只涉及2个概念: 容器和网络 对网络的设置通过插件进行实现, CNI 包括 CNI Plugin 和 IPAM ( IP address management) Plugin 两类插件. CNI Plugin 负责为容器配置网络资源, IPAM plugin 负责对容器的IP 地址进行分配和管理 IPAM Plugin 作为 CNI plugin 的一部分, 与CNI plugin 一起工作. CNI plugin 包括三个基本的接口定义, add check, version 这些接口的具体实现要求插件提供一个可执行的程序,在容器网络添加或删除时进行调用, 以完成具体操作 1 add 接口参数定义如下 返回信息如下 2 删除接口参数如下 3 检查接口参数如下 CNI plugin 可以支持环境变量映射到对应的参数 例子 IPAM 可执行程序也处理传递给CNI plugin的参数,并返回包含ips routes dns 三段内容的结果 一个容器可以运行多个CNI plugin, 多个plugin 按照 配置文件中定义的先后顺序从前到后执行, 删除时, 则反序执行, 最后执行的plugin, 最先被删除, 多网络配置的json 格式为 K8S 目前支持两种网络插件的实现 启用插件的命令, 字启动kubelet 服务的启动参数上设置下面的参数 在–network-plugin 为 cni 时, 还需下面两个参数 目前开源的cni 插件有 calico canal cilium contiv flannel 等 如果文章对您有帮助,请点一下下面的 "喜欢"
⑦ k8s安装部署
K8s集群搭建 1 centos版本信息查看 [[email protected] ~]# uname -a Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux k8s集群机器关闭防火墙 [[email protected] ~]# systemctl stop firewalld [[email protected] ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. 2 安装必要的包 k8s集群安装以下安装包 [[email protected] ~]# yum -y install net-tools wget vim ntpd [[email protected] ~]# systemctl enable ntpd [[email protected] ~]# systemctl start ntpd 3配置hosts [[email protected] ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.248.141 k8s-master 192.168.248.142 k8s-node 4 部署master节点 4.1 Master节点安装必要的安装包 [[email protected] ~]# yum -y install etcd 4.2更改/etc/etcd/etcd.conf配置文件 [[email protected] etcd]# cat /etc/etcd/etcd.conf | grep -v "^#" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001" ETCD_NAME="master" ETCD_ADVERTISE_CLIENT_URLS= http://k8s-master:2379,http://k8s-master:4001 4.3设置开机启动并验证状态 [[email protected] ~]#systemctl enable etcd [[email protected] ~]#systemctl start etcd etcd检查 [[email protected]_master ~]# etcdctl -C http://k8s-master:4001 cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://k8s_master:2379 cluster is healthy [[email protected]_master ~]# etcdctl -C http://k8s-master:2379 cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://k8s_master:2379 cluster is healthy 5 安装部署docker环境(略) 6 安装kubernetes [[email protected]_master ~]# yum install kubernetes 安装过程中报错如下 Error: docker-ce conflicts with 2:docker-1.13.1-75.git8633870.el7.centos.x86_64 可以执行如下命令解决 1、查看安装过的docker:yum list installed | grep docker 2、卸载docker:yum remove -y docker-ce.x86_64 0:18.03.0.ce-1.el7.centos 3、删除容器镜像:rm -rf /var/lib/docker 再次安装kubernetes,安装成功,而且会自动安装docker 6.1修改apiserver服务的配置文件 [[email protected] kubernetes]# cat /etc/kubernetes/apiserver | grep -v "^#" KUBE_API_ADDRESS="–insecure-bind-address=0.0.0.0" KUBE_API_PORT="–port=8080" KUBE_ETCD_SERVERS="–etcd-servers=http://192.168.248.141:2379" KUBE_SERVICE_ADDRESSES="–service-cluster-ip-range=10.254.0.0/16" KUBE_ADMISSION_CONTROL="–admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota" KUBE_API_ARGS="" 6.2修改config配置文件: [[email protected] kubernetes]# cat /etc/kubernetes/config | grep -v "^#" KUBE_LOGTOSTDERR="–logtostderr=true" KUBE_LOG_LEVEL="–v=0" KUBE_ALLOW_PRIV="–allow-privileged=false" KUBE_MASTER="–master=http://192.168.248.141:8080" 设置开机启动,开启服务 [[email protected] ~]#systemctl enable kube-apiserver kube-controller-manager kube-scheler docker [[email protected] ~]#systemctl start kube-apiserver kube-controller-manager kube-scheler docker 6.3查看服务端口: [[email protected] ~]# netstat –tnlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1273/master tcp 0 0 127.0.0.1:2380 0.0.0.0:* LISTEN 2126/etcd tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 571/rpcbind tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1362/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 998/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 996/cupsd tcp6 0 0 ::1:25 :::* LISTEN 1273/master tcp6 0 0 :::4001 :::* LISTEN 2126/etcd tcp6 0 0 :::6443 :::* LISTEN 3216/kube-apiserver tcp6 0 0 :::10251 :::* LISTEN 3222/kube-scheler tcp6 0 0 :::2379 :::* LISTEN 2126/etcd tcp6 0 0 :::10252 :::* LISTEN 3221/kube-controlle tcp6 0 0 :::111 :::* LISTEN 571/rpcbind tcp6 0 0 :::8080 :::* LISTEN 3216/kube-apiserver tcp6 0 0 :::22 :::* LISTEN 998/sshd tcp6 0 0 ::1:631 :::* LISTEN 996/cupsd 7部署node节点 7.1安装docker(略)安装k8s(略) 7.2 Node节点主机做以下配置: 修改config配置文件 [[email protected] kubernetes]# cat /etc/kubernetes/config | grep -v "^#" KUBE_LOGTOSTDERR="–logtostderr=true" KUBE_LOG_LEVEL="–v=0" KUBE_ALLOW_PRIV="–allow-privileged=false" KUBE_MASTER="–master=http://192.168.248.141:8080" 修改kubelet配置文件 [[email protected] kubernetes]# cat /etc/kubernetes/kubelet | grep -v "^#" KUBELET_ADDRESS="–address=0.0.0.0" KUBELET_HOSTNAME="–hostname-override=192.168.248.142" KUBELET_API_SERVER="–api-servers=http://192.168.248.141:8080" KUBELET_POD_INFRA_CONTAINER="–pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" KUBELET_ARGS="" 设置开机启动、开启服务 [[email protected]_client1 ~]# systemctl enable kubelet kube-proxy [[email protected]_client1 ~]# systemctl start kubelet kube-proxy 查看端口: [[email protected]_client1 ~]# netstat –ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1277/master tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 3246/kubelet tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 3133/kube-proxy tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 575/rpcbind tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1332/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1000/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 998/cupsd tcp6 0 0 ::1:25 :::* LISTEN 1277/master tcp6 0 0 :::4194 :::* LISTEN 3246/kubelet tcp6 0 0 :::10250 :::* LISTEN 3246/kubelet tcp6 0 0 :::10255 :::* LISTEN 3246/kubelet tcp6 0 0 :::111 :::* LISTEN 575/rpcbind tcp6 0 0 :::22 :::* LISTEN 1000/sshd tcp6 0 0 ::1:631 :::* LISTEN 998/cupsd Master上查看集群中的节点及节点状态 [[email protected] kubernetes]# kubectl get node NAME STATUS AGE 192.168.248.142 Ready 2m [[email protected] kubernetes]# kubectl -s http://k8s-master:8080 get node NAME STATUS AGE 192.168.248.142 Ready 2m kubernetes集群搭建完成。 在k8s集群中创建pod,如果出现如下错误 其中最主要的问题是:details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory) 解决方案: 查看/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt (该链接就是上图中的说明) 是一个软链接,但是链接过去后并没有真实的/etc/rhsm,所以需要使用yum安装: yum install *rhsm* 安装完成后,执行一下docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest 如果依然报错,可参考下面的方案: wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv –to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem 注释:rpm2cpio命令用于将rpm软件包转换为cpio格式的文件 cpio命令主要是用来建立或者还原备份档的工具程序,cpio命令可以复制文件到归档包中,或者从归档包中复文件。 -i 还原备份档 -v 详细显示指令的执行过程 这两个命令会生成/etc/rhsm/ca/redhat-uep.pem文件. [[email protected] ~]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest 在master节点新建pod并查看起状态为正常 flannel是CoreOS提供用于解决Dokcer集群跨主机通讯的覆盖网络工具。它的主要思路是:预先留出一个网段,每个主机使用其中一部分,然后每个容器被分配不同的ip;让所有的容器认为大家在同一个直连的网络,底层通过UDP/VxLAN等进行报文的封装和转发。