锻骨境-第2层: k8s安装过程的背后

这里主要说一下上一层搭建过程中的问题

问题如下

关于网络的问题

一个是解析的问题,一个是虚拟IP分配已经路由的问题,涉及到的是DNS和Flannel两个组件。

DNS 的问题

DNS通过使用插件管理系统cluster add-on,成为了一个内建的自启动服务解析。
我们一般使用CoreDNS 组件来实现service 服务的解析达到找到后面的pod 的目的。

Kubernetes 域名的全称,必须是 service-name.namespace.svc.cluster.local 这种模式,服务名

# nslookup kubernetes.default.svc.cluster.local
Server:        10.200.254.254
Address:    10.200.254.254:53

Name:    kubernetes.default.svc.cluster.local
Address: 10.200.0.1

DNS 策略是可以设置的,既dnsPolicy。

DNS解决的是寻址的问题,Flannel 解决的是地址分配的问题,既虚拟IP的分配。
为了解决网络规划的问题,所以我们又使用了Flannel .

Flannel 的问题说明

Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。
如果没有这个组件,那么在不同的节点上的Docker 服务起来的容器,虚拟IP 首先是可能重复的,而且不同节点上的IP是无法互通的既ping .

Flannel 是每个节点会有一个网络代理组件(overlay方式)flanneld,会为所在主机从集群的网络地址空间中,获取一个小的网段subnet,本主机内所有容器的IP地址都将从中分配。通过以下命令查看某个节点获取的网段信息:

[root@k8s-node2 ~]# cat /run/flannel/subnet.env

它是一种覆盖网络,也就是会把TCP数据包保证到另一种网络包进行路由转发和通信。
覆盖网络是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将一个分组封装在另一个分组内来将网络服务与底层基础设施分离。在将封装的数据包转发到端点后,将其解封装

Flannel是一个DaemonSet服务,所以每个节点都会有个代理服务,然后,每个节点也会有一个虚拟网卡,接收docker 网卡的数据,并维护路由,进行数据的封包转发。

Flannel 也是高度和Etcd 集成的,通过etcd ,所有的node 看到的flannel 的配置是相同的,每个节点上的flannel 代理组件箭筒etcd 的数据变化,从而感知集群的node 变化。

[root@k8s-master pki]# kubectl  get daemonset  --all-namespaces 
NAMESPACE        NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                   AGE
kube-system      kube-flannel-ds-amd64   2         2         1       2            1           beta.kubernetes.io/arch=amd64   304d
kube-system      kube-proxy              2         2         1       2            1           <none>                          304d
metallb-system   speaker                 1         1         1       1            1           <none>                          189d

Pod之间互相访问

flanneld将本主机获取的subnet以及用于主机间通信的Public IP通过etcd存储起来,需要时发送给相应模块。
flannel利用各种backend mechanism,例如udp,vxlan等等,跨主机转发容器间的网络流量,完成容器间的跨主机通信。

image.png
  • 不同node上的pod的通信流程:

pod中产生数据,根据pod的路由信息,将数据发送到Cni0
Cni0 网桥设备,据节点的路由表,将数据发送到隧道设备flannel.1
Flannel.1 overlay网络的设备查看数据包的目的ip,从flanneld获得对端隧道设备的必要信息,封装数据包。
Flannel.1 overlay网络的设备 将数据包发送到对端设备。对端节点的网卡接收到数据包,发现数据包为overlay数据包,解开外层封装,并发送内层封装到flannel.1设备。
Flannel.1设备查看数据包,根据路由表匹配,将数据发送给Cni0设备。
Cni0匹配路由表,发送数据给网桥上对应的端口。

存在问题

1.不支持pod之间的网络隔离。Flannel设计思想是将所有的pod都放在一个大的二层网络中,所以pod之间没有隔离策略。

2.设备复杂,效率不高。Flannel模型下有三种设备,数量经过多种设备的封装、解析,势必会造成传输效率的下降。

关于kebeadm 参数问题

其实,默认使用kubeadm init 安装的时候,在/var/lib/kubelet 下会生成配置文件config.yaml

[root@k8s-master ~]# cd /var/lib/kubelet/
[root@k8s-master kubelet]# ls
config.yaml  cpu_manager_state  device-plugins  kubeadm-flags.env  pki  plugin-containers  plugins  plugins_registry  pod-resources  pods
[root@k8s-master kubelet]# 
[root@k8s-master kubelet]# cat config.yaml 

其实,更好的方式,是使用kubeadm 的配置文件来配置kubelet,如搭建高可用的时候,就必须使用配置文件了。这样,每个节点的配置很清晰

  • 如何实现高可用的master 节点集群
    首先,ETCD 组件必须是个集群,然后,我们也是需要在每个master上执行kubeadm init 操作,当然,使用配置文件的话,,命令就是:
    kubectl inti --config xxx.yaml

配置文件的格式如下:

apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
api:
advertiseAddress: <master-private-ip>
etcd:
endpoints:
- [http://<master0-ip-address>:2379](http://%3Cmaster0-ip-address%3E:2379/)
- [http://<master1-ip-address>:2379](http://%3Cmaster1-ip-address%3E:2379/)
- [http://<master2-ip-address>:2379](http://%3Cmaster2-ip-address%3E:2379/)
caFile: /etc/kubernetes/pki/etcd/ca.pem
certFile: /etc/kubernetes/pki/etcd/client.pem
keyFile: /etc/kubernetes/pki/etcd/client-key.pem
networking:
podSubnet: <podCIDR>
apiServerCertSANs:
- <load-balancer-ip>
apiServerExtraArgs:
endpoint-reconciler-type: lease

需要注意的是,我们要获取到etcd 的证书文件信息,配置pod 的网段,配置api service 高可用地址,一般可以用slb 或者HA 做为高可用。

因为k8s 的组件状态,资源信息,配置均存在于ETCD,故ETCD是大脑的核心部分。其他组件均围绕ETCD展开。ETCD必须高可用。

etcd 证书位置

[root@k8s-master pki]# pwd
/etc/kubernetes/pki
[root@k8s-master pki]# ls
apiserver.crt              apiserver-etcd-client.key  apiserver-kubelet-client.crt  ca.crt  etcd                front-proxy-ca.key      front-proxy-client.key  sa.pub
apiserver-etcd-client.crt  apiserver.key              apiserver-kubelet-client.key  ca.key  front-proxy-ca.crt  front-proxy-client.crt  sa.key

有时候重启机器,连接不上节点的问题

主要是重启下kubelet 即可。

[root@k8s-master apple]# kubectl  get po 
The connection to the server 192.168.10.133:6443 was refused - did you specify the right host or port?

执行如下:
systemctl daemon-reload
systemctl restart kubelet

关于cgroups-driver 的配置问题

docker 和 kubelet 的cgroup-driver 不符合,那么在 kubeadm init 的时候会导致Kubelet 启动失败,那么要做以下修改。
修改kubelet 的方式如下:

[root@k8s-master k8s]# vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 
# 添加--cgroup-driver=cgroupfs"
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cgroup-driver=cgroupfs"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
[root@k8s-master k8s]# systemctl daemon-reload
[root@k8s-master k8s]# 
[root@k8s-master k8s]# systemctl enable kubelet

docker cgroup-driver 的修改方式如下:

[root@k8s-node1 etcd]#  vim /etc/docker/daemon.json 

{
  "registry-mirrors": ["https://uob2vbvb.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]

}
[root@k8s-node1 etcd]# 
[root@k8s-node1 etcd]# 
[root@k8s-node1 etcd]# 
[root@k8s-node1 etcd]# systemctl daemon-reload
[root@k8s-node1 etcd]# 
[root@k8s-node1 etcd]# systemctl restart docker

kubelet kubeadm kubectl 版本问题

经过查阅官网资料,k8s的组件不能超过1个版本,既1.14 的组件可以安装1.14或者1.13 版本的k8s 集群,
安装k8s 1.15 会有版本倾斜的问题。

一定注意自己使用的版本。

下一层:开发环境k8s 高可用master 的搭建

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容