Calico网络


两台Docker主机如何实现容器互通?

Docker跨主机会分配相同的的IP,这样肯定是无法通信的,在本地ping 172.17.0.2肯定是找的该主机上面的172.0.02不会去找另外一台主机上面的容器 

Q:

1、统一管理这些k8s node网段,保障每个容器分配不一样的ip

2、要知道转发哪个docker主机?

3、怎么实现这个转发(从docker主机1上容器发送到另一台docker主机上容器)

A:

1、给每个docker主机分配唯一的网段

2、做好记录,每个docker主机对应的网段

3、可以使用iptables或者把宿主机当做一个路由器,配置路由表

Docker里面的容器实际上都连接到了dokcer0这个网桥上面,他们之间的通信就像局域网之间的通信。所以本机的docker容器网络通信已经解决了。引入CNI主要是为了解决容器跨主机网络通信。

为了解决这些网络需求需要部署网络组件,CNI是容器是一个容器网络接口规范,k8s就采用了这个规范去实现的

 

K8s CNI网络模型

K8s是一个扁平化网络。(只要部署了网络插件,k8s当中的网络就全部打通了)

即所有部署的网络组件都必须满足如下要求:

• 一个Pod一个IP

• 所有的 Pod 可以与任何其他 Pod 直接通信

• 所有节点可以与所有 Pod 直接通信

• Pod 内部获取到的 IP 地址与其他 Pod 或节点与其通信时的 IP 地址是同一个

主流网络组件有:Flannel、Calico等

 

k8s集群安装完毕验证


测试kubernetes集群

- 验证Pod工作

- 验证Pod网络通信

- 验证DNS解析

验证Pod工作

在Kubernetes集群中创建一个pod,验证是否正常运行:

[root@k8s-master ~]# kubectl create deployment nginx --image=nginx
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
[root@k8s-master ~]# kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-6799fc88d8-drb2s   1/1     Running   0          109s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP        103m
service/nginx        NodePort    10.99.50.2   <none>        80:31332/TCP   23s

内部访问是通过cluster ip 10.99.50.2,集群内部访问是这个IP,这个可以在任意一个节点都可以访问

[root@k8s-master ~]# curl 10.99.50.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

[root@k8s-node1 ~]# curl 10.99.50.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

如果要在集群外部浏览器访问要使用31332端口,通过任意一个节点的IP+端口,这个端口随机生成的,31332是对外暴露的端口,任意一个节点的ip加上该端口号就可以访问

验证Pod网络通信

主要部署的calio组件是否是正常的

Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubernetes、OpenStack等。

Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器( vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。

此外,Calico  项目还实现了 Kubernetes 网络策略,提供ACL功能。

简单理解就是calio就是网络插件的一种

比如通过clusterip +端口号  在任意一个节点都是可以访问的,这个容器其实是分配在其中一个节点,访问该ip会转发到该容器上面,相对于虚拟的负载均衡器一样,这是一个VIP,帮你转发到后端的容器当中。这样在每台机器访问意味着容器不管是在哪个节点,都能够帮你提供响应

[root@k8s-master ~]# kubectl get pod -n kube-system -o wide
NAME                                       READY   STATUS         RESTARTS   AGE    IP                NODE         NOMINATED NODE   READINESS GATES
calico-kube-controllers-5c6f6b67db-q5qb6   1/1     Running        2          4d6h   10.244.36.75      k8s-node1    <none>           <none>
calico-node-6hgrq                          1/1     Running        2          4d6h   192.168.179.102   k8s-master   <none>           <none>
calico-node-jxh4t                          1/1     Running        2          4d6h   192.168.179.103   k8s-node1    <none>           <none>
calico-node-xjklb                          1/1     Running        3          4d6h   192.168.179.104   k8s-node2    <none>           <none>

 

 

部署 Dashboard


[root@k8s-master ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml

修改,只需要添加一行 

spec:
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort   加上这一行就行了
[root@k8s-master ~]# kubectl apply -f recommended.yaml 

[root@k8s-master ~]# kubectl get pods -n kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-7b59f7d4df-5tzgb   1/1     Running   0          56s
kubernetes-dashboard-5dbf55bd9d-tgt7b        1/1     Running   0          57s
[root@k8s-master ~]# kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.108.138.194   <none>        8000/TCP        64s
kubernetes-dashboard        NodePort    10.106.187.194   <none>        443:31383/TCP   65s

这里暴露的是443表示使用https访问,对外暴露端口是31383

使用https访问(这里的证书是自签证书,这个证书是不会被信任的) 

 

这里使用token来认证,创建service account并绑定默认cluster-admin管理员集群角色:

 创建用户

[root@k8s-master ~]#  kubectl create serviceaccount dashboard-admin -n kube-system
serviceaccount/dashboard-admin created

用户授权 

[root@k8s-master ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created

获取用户Token

[root@k8s-master ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
Name:         dashboard-admin-token-spfnp
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: dashboard-admin
              kubernetes.io/service-account.uid: 8e757c86-13af-47fa-8d69-a4d0805d0152

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1066 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6InR0cTRHNDNQUGFMeUZ5Rnp1azZnSUEyRVU0WEY1dWdEMEYwd056ZnNkWWcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tc3BmbnAiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOGU3NTdjODYtMTNhZi00N2ZhLThkNjktYTRkMDgwNWQwMTUyIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.zbOZ4-5UKqllErK1HLZ75srq6zeBzWWNtmz5LTIS0HES-Ih-HZbyGRJxqoW7-T692DW2J-LvRIZH-RrCw-V-wWT435KR-fku6X6YR6tTSzaUIYB3eh3UDjrgQlHriy1M752YwoCpXBi0k3sHAvzGPDJFupeihum2Dr3ZCvUqtpKeSx9zEoWEXWKyVyux4Wr7zbDYWGT-fe2DEAikosKt_70xPM3igexUT67ljH7DdITWzdcEFqB78NVfWGzSlLX6zddvQu2O17NLL_ea-yaxcv6rSMyYgYShRoPwmY55HHsP81dWuoIosBKml-TYbXAQXIcruKvU0vRS71KzN9yAyQ

使用输出的token登录Dashboard。

 

安装 Kuboard 


https://kuboard.cn/install/install-dashboard.html#%E5%89%8D%E6%8F%90 

kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml
kubectl apply -f https://addons.kuboard.cn/metrics-server/0.3.7/metrics-server.yaml

查看 Kuboard 运行状态:

[root@k8s-master ~]# kubectl get pods -l k8s.kuboard.cn/name=kuboard -n kube-system
NAME                       READY   STATUS    RESTARTS   AGE
kuboard-74c645f5df-l7rmf   1/1     Running   1          46h

获取Token

拥有的权限

  • 此Token拥有 ClusterAdmin 的权限,可以执行所有操作

执行命令

# 如果您参考 www.kuboard.cn 提供的文档安装 Kuberenetes,可在第一个 Master 节点上执行此命令

echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)

输出

取输出信息中 token 字段

eyJhbGciOiJSUzI1NiIsImtpZCI6InR0cTRHNDNQUGFMeUZ5Rnp1azZnSUEyRVU0WEY1dWdEMEYwd056ZnNkWWcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXVzZXItdG9rZW4tcGNzbGsiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoia3Vib2FyZC11c2VyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMmRlODY2ZjktZDUwZC00YzA3LTliZTctMTNkODRmZWJmYWRjIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmt1Ym9hcmQtdXNlciJ9.WvJ4NUbSw1FVFpltpD5T_LQVnJwL8XZbG2HCVPOlVN4cKD_2HLSBEvGl0rZ5ydqitQqds-o-6bjvbWOhKapMQTTHsI7-YeX9N2bjcAd4DCWo_TwR6TJ316yY1F6N94eQHF_Cjok3uOxHayE5banYQXKmsPrrUONbjBoCfU4kFIvRcam0y77QGNtNXUK4nHd0mb69IDNFZIX_42YQCUb2SH9_GNf-7EVpZniKwgGLwNLzbFqQPt7SrB4vLNPTXWWqLl-6SBg5p5RTI1n73ohBA5XURZXU7nmkh_T_jwKqGf9pFfPNPLe-VbsS7geearWrdq0KGgl-aTiTGKmAuGhxPQ

访问Kuboard

您可以通过NodePort访问 Kuboard

Kuboard Service 使用了 NodePort 的方式暴露服务,NodePort 为 32567;您可以按如下方式访问 Kuboard。

http://任意一个Worker节点的IP地址:32567/

Logo

开源、云原生的融合云平台

更多推荐