k8s实践

Posted freshmans

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s实践相关的知识,希望对你有一定的参考价值。

内网中k8s的相关配置

kubernetes是以pod而不是docker容器为管理单元的,在k8s创建pod时,还会通过 启动一个名为 google_container/pause的镜像来实现pod的概念,该镜像文件存在谷歌镜像库http://gcr.io中,需要一台能上internet的服务器将其下载并导出,push到私有docker registry中

 

修改每台node的kubelet服务的启动参数,加上 --pod_infra_container_images参数,指定为私有docker Registry中pause镜像的地址

[[email protected]_node1 ~]# cat /etc/kubernetes/kubelet
KUBELET_ARGS="--cluster_dns=10.254.10.2 --pod_infra_container_image=gcr.io/google_containers/pause-amd64:3.0"

#注: --pod_infra_container_image的值根据实际pause的地址进行修改,一版传到内网私有registry上去后直接写内网地址即可

如果以上地址不能用,换成如下

--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0   

 

重启kubelet服务

systemctl restart  kubelet

 

k8s集群网络配置

 

  • flannel(覆盖网络)

 拓扑图技术分享图片

 

基础原理

#A主机
1、容器直接使用目标容器的ip访问,默认通过容器内部的eth0发送出去。 2、报文通过veth pair被发送到vethXXX。 3、vethXXX是直接连接到虚拟交换机docker0的,报文通过虚拟bridge docker0发送出去。 4、查找路由表,外部容器ip的报文都会转发到flannel0虚拟网卡,这是一个P2P的虚拟网卡,然后报文就被转发到监听在另一端的flanneld。 5、flanneld通过etcd维护了各个节点之间的路由表,把原来的报文UDP封装一层,通过配置的iface发送出去。 6、报文通过主机之间的网络找到目标主机。 ##B主机
7、报文继续往上,到传输层,交给监听在8285端口的flanneld程序处理。 8、数据被解包,然后发送给flannel0虚拟网卡。 9、查找路由表,发现对应容器的报文要交给docker0。 10、docker0找到连到自己的容器,把报文发送过去。

 

flannel采用覆盖网络(overlay Network)模型来完成对网络的打通

①、安装etcd

      由于flannel使用etcd作为数据库,所以需要预先安装好etcd,这里略过,k8s集群安装有详细步骤

②、安装flannel

      需要在每台node上安装flannel,安装方法见 k8s集群安装文档

③、配置flannel

[[email protected]_node2 ~]# systemctl status flanneld        #通过这条命令查看flannel的启动文件
● flanneld.service - Flanneld overlay address etcd agent
   Loaded: loaded (/usr/lib/systemd/system/flanneld.service; enabled; vendor preset: disabled)
   Active: active (running) since 二 2018-07-10 18:01:45 CST; 6 days ago
 Main PID: 50935 (flanneld)
   Memory: 8.8M
   CGroup: /system.slice/flanneld.service
           └─50935 /usr/bin/flanneld -etcd-endpoints=http://192.168.132.148:2379 -etcd-prefix=/atomic.io/network
。。。。。。

[[email protected]_node2 ~]# cat /usr/lib/systemd/system/flanneld.service    #查看启动文件。查看加载的配置问津
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/flanneld
EnvironmentFile=-/etc/sysconfig/docker-network
ExecStart=/usr/bin/flanneld-start $FLANNEL_OPTIONS
ExecStartPost=/usr/libexec/flannel/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure

[Install]
WantedBy=multi-user.target
RequiredBy=docker.service


[[email protected]_node2 ~]# cat /etc/sysconfig/flanneld|grep -v "^#|^$"      #查看flannel配置文件
FLANNEL_ETCD_ENDPOINTS="http://192.168.132.148:2379"
FLANNEL_ETCD_PREFIX="/atomic.io/network"

 

master端创建网络(只在master端执行)

etcdctl mk /atomic.io/network/config {"Network": "10.1.0.0/16"}  #注意这里的蓝色字体部分要与node flanneld配置文件中的flannel_etcd_prefix名称一样

 

由于flannel将覆盖docker0网桥,所以如果docker服务已经启动,可尝试将docker服务停止,或者删除docker0网桥详见 k8s集群安装博客

启动flannel服务

systemctl start flanneld

 

  • openswitch(虚拟交换机)

 拓扑图

技术分享图片

首先配置两个node的docker0网桥地址不同

节点名称 ens33 ip docker0 ip
node1 192.168.248.139 172.17.42.1
node2 192.168.248.140 172.17.43.1

 

自定义 设置docker0 ip方法只需修改 daemon.json文件即可

[[email protected] ~]# cat /etc/docker/daemon.json 
{"bip": "172.17.42.1/24"}

[[email protected] ~]# cat /etc/docker/daemon.json 
{"bip": "172.17.43.1/24"}


#重启docker服务
systemctl daemon-reload
systemctl restart docker

 

安装并启动openvswitch

yum install openvswitch

systemctl start openswitch

 

查看openswitch是否安装成功

#查看进程
service openvswitch stauts

#查看相关日志
more /var/log/messages | grep openvswitch

 

创建网桥和GRE隧道(需要在每个node上建立ovs网桥br0,然后在网桥上创建一个GRE隧道连接对端网桥,最后把ovs网桥br0作为一个端口连接到docker0 这个linux网桥上)

注:node1和node2 操作相同,只是设置点对点ip的时候略有不同

node1 操作
ovs
-vsctl add-br br0      #创建ovs网桥 ifconfig            #查看有没有新建的br0网桥,如果没有重启openswitch ovs-vsctl add-port br0 gre1 -- set interface gre1 type=gre option:remote_ip=192.168.248.140    #remote为对端物理网卡的ip地址(eth0或ens33或其他) brctl addif docker0 br0          #添加br0到本地 docker0网桥
#启动docker0和br0网桥
ip link set dev br0 up ip link set dev docker0 up ip route add
172.17.0.0/16 dev docker0        #添加到主机的路由 node2 操作 ovs-vsctl add-br br0 ifconfig              #查看有没有新建的br0网桥,如果没有重启 openswich ovs-vsctl add-port br0 gre1 -- set interface gre1 type=gre option:remote_ip=192.168.248.139 brctl addif docker0 br0 ip link set dev br0 up ip link set dev docker0 up ip route add 172.17.0.0/16 dev docker0

:如果有多个node,需要建立n*(n-1)条 GRE隧道,组成一个网格结构

 

查看添加情况并测试

[[email protected] ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:b0:88:b7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.248.139/24 brd 192.168.248.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::e1d4:5d25:cb99:2fea/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:d1:b3:15:a9 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/24 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:d1ff:feb3:15a9/64 scope link 
       valid_lft forever preferred_lft forever
4: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether ce:74:4c:34:b3:f9 brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UNKNOWN qlen 1000
    link/ether 3a:fe:f3:1c:26:40 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::dcc0:48ff:fed0:85f4/64 scope link 
       valid_lft forever preferred_lft forever
6: [email protected]: <NOARP> mtu 1476 qdisc noop state DOWN qlen 1
    link/gre 0.0.0.0 brd 0.0.0.0
7: [email protected]: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
8: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65490 qdisc pfifo_fast master ovs-system state UNKNOWN qlen 1000
    link/ether 4e:3b:c4:9c:31:79 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::4c3b:c4ff:fe9c:3179/64 scope link 
       valid_lft forever preferred_lft forever

[[email protected] log]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:f3:1b:1c brd ff:ff:ff:ff:ff:ff
    inet 192.168.248.140/24 brd 192.168.248.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::2199:b4c3:7d80:32c1/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:7e:c0:fc:bf brd ff:ff:ff:ff:ff:ff
    inet 172.17.43.1/24 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:7eff:fec0:fcbf/64 scope link 
       valid_lft forever preferred_lft forever
4: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether b2:5a:cb:e5:e3:7a brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UNKNOWN qlen 1000
    link/ether 36:f2:10:c9:48:45 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::6810:75ff:feab:ca2f/64 scope link 
       valid_lft forever preferred_lft forever
6: [email protected]: <NOARP> mtu 1476 qdisc noop state DOWN qlen 1
    link/gre 0.0.0.0 brd 0.0.0.0
7: [email protected]: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
8: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65490 qdisc pfifo_fast master ovs-system state UNKNOWN qlen 1000
    link/ether 12:07:43:72:34:d4 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::1007:43ff:fe72:34d4/64 scope link 
       valid_lft forever preferred_lft forever


测试,在node上ping 另一个node的 docker0网桥

[[email protected] ~]# ping 172.17.43.1
PING 172.17.43.1 (172.17.43.1) 56(84) bytes of data.
64 bytes from 172.17.43.1: icmp_seq=1 ttl=64 time=0.960 ms
64 bytes from 172.17.43.1: icmp_seq=2 ttl=64 time=15.9 ms


[[email protected] log]# ping 172.17.42.1
PING 172.17.42.1 (172.17.42.1) 56(84) bytes of data.
64 bytes from 172.17.42.1: icmp_seq=1 ttl=64 time=2.34 ms
64 bytes from 172.17.42.1: icmp_seq=2 ttl=64 time=0.385 ms

 

  • 直接路由

使用直接路由的方式,只要在每个node上的路由表中添加到对方docker0的静态路由转发规则

如:
pod1所在 docker0 网桥的ip子网是 10.1.10.0,node地址为 192.168.132.131;pod2所在docker0网桥的ip子网为 10.1.20.0,node地址为 192.168.132.132

#node1上添加一条道node2的路由

route add -net 10.1.20.0(node2-docker0-IP) netmask 255.255.255.0 gw 192.168.132.132(node2-eth0-IP)

#node2上添加一条道node1的路由

route add -net 10.1.10.0(node1-docker0-IP) netmask 255.255.255.0 gw 192.168.132.131(node1-eth0-IP)

 

  • calico

  拓扑图

技术分享图片

核心组件说明

Calico的核心组件包括:Felix、etcd、BIRD、BIRD。

Felix,即Calicoagent,跑在kubernetes的node节点上,主要负责配置路由及ACLs等信息来确保endpoint的连通状态;

etcd,分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性,可以与kubernetes共用;

BGPClient(BIRD), 主要负责把 Felix写入 kernel的路由信息分发到当前 Calico网络,确保 workload(虚拟机、容器、pod等)间的通信的有效性;worklaod之间数据传输无需封包解包

BGPRoute Reflector(BIRD), 大规模部署时使用,摒弃所有节点互联的mesh模式,通过一个或者多个 BGPRoute Reflector 来完成集中式的路由分发;

#说明:
    Calico在每一个计算节点利用linux kernel实现了一个高效的vRouter来负责数据转发,每个vRouter通过BGP协议负责把自己上运行的workload的路由信息负责在整个Calico网络内组播
通过基于iptables的ACLs来提供多租户的隔离

 

kubectl 语法

详见 k8s命令使用博客

 

以上是关于k8s实践的主要内容,如果未能解决你的问题,请参考以下文章

k8s1.4.3安装实践记录-k8s安装

更新片段参数的最佳实践?

k8s 实践经验:k8s 系列实战前夕

大型有状态服务基于 K8s 的落地实践——按部门租户隔离

在片段和活动之间进行通信 - 最佳实践

[云原生那些事]k8s实践入门