14 8 月, 2022
coreDNS实现了服务在集群内被自动发现,那么如何实现服务在集群外被自动发现呢?这里有两种方法,这里只关注Ingress资源:
- 使用nodeport service,在这种方法中,kube-proxy只能使用iptables模型,不能使用ipvs模型;
- 使用Ingress资源,只能调度并暴露7层应用,特质http或https;
常用的Ingress控制器主要有以下几种,这里使用traefik:
- Ingress-nginx
- HAProxy
- Traefik
注意:ingress资源和ingress控制器不是一个东西(具体可以看最下面的流程图):
- ingress资源:专用于暴露7层应用(http/https)到k8s集群外的一种核心资源;
- ingress控制器:简化版本的nginx(调度流量)+go脚本(动态识别yaml,主要用于监控ingress配置清单的变化以做出应对),traefik就是其中之一;
安装部署Traefik
上传Traefik的Image
完整阅读
14 8 月, 2022
服务发现
服务之间互相定位的过程,以适应如下服务特点:
在k8s集群里,pod ip是不断变化的,如何找到对应的pods?首先集群网络抽象了集群IP,Service资源绑定Cluster IP并暴露这个资源,Service本身根据标签选择器,来锁定一组pods,并通过ipvs算法分配这组pods的资源。也可以参考上一篇的总结:管理Service资源。
那么新的问题来了,虽然可以通过Service找到pod,但如果有很多不同的Services,很难把所有Services与Customer IP的关系记下来,这个是不是很像DNS被创造出来的初衷^_^~?那我们是否可以通过类似DNS的机制,绑定Service和Cluster IP呢?答案是肯定的:
- Kube-dns,k8s v1.10之前默认使用;
- Coredns,k8s v1.11以后默认使用;
安装部署CoreDNS
完整阅读
13 8 月, 2022
我看的教程算是2020年初的,所以根据现在的时间,已经过去两年半了,下面的信息不一定很准确,后面如果哪里不正确,随着学习的深入,再更改和说明。CNI的全程是Container Network Interface,主要为了解决Pod资源在不同宿主机之间互通的。
常见CNI组件
所有CNI都部署在node节点;
- Flannel,19年的市场占有率38%;
- Calico,19年的市场占有率35%;
- Canal:结合了flannel和calico;19年的市场占有率5%;
- Contiv:思科开源的;
- OpenContrail:Juniper开源的;
- NSX-T:vmware开源的;
- Kube-router:试图取代kube-proxy,但使用的不多;
Flannel
安装部署Flannel
可以从Github上直接下载,目前Link在这里:https://github.com/flannel-io/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64.tar.gz,但国内环境可能不好,所以需要科学上网或者多尝试几次;分别在node13和node14上部署Flannel:
完整阅读
11 8 月, 2022
陈述式管理(CLI)
陈述式管理方式主要通过kubectl来进行管理,kubectl用于与apiserver进行通信,实现管理k8s各种资源的一种有效途径;
管理名称空间
查看名称空间
下面显示的都是默认生成的命名空间,简称为kubectl get ns:
root@f0-13:~# kubectl get namespace
NAME STATUS AGE
default Active 44h
kube-node-lease Active 44h
kube-public Active 44h
kube-system Active 44h
查询特定命名空间中的所有资源,下面是default命名空间:
root@f0-13:~# kubectl get all -n default
NAME READY STATUS RESTARTS AGE
pod/nginx-ds-lc59t 1/1 Running 0 39h
pod/nginx-ds-pkh75 1/1 Running 0 39h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 44h
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/nginx-ds 2 2 2 2 2 <none> 39h
完整阅读
7 6 月, 2022
安装docker步骤此处忽略,详细可以看之前的文章;
容器的网络类型
默认docker三种网络:
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
0dc7621fa6c0 bridge bridge local
09d08085f98c host host local
8da76deb9eb9 none null local
先随便开一个centos的docker,“-t” 指定一个伪终端,保持docker可以打开,否则会出现“Exited (0)”的问题:
[root@localhost ~]# docker run --name centos -dt centos
查看容器的网络类型,可以看到当创建容器不指定网络类型,默认会绑定到bridge上:
[root@localhost ~]# docker inspect 355a |grep "Networks" -A 100
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "0dc7621fa6c0e40a1129104ed94deac543cf82ce44ab79fdf7ed38b9975f9a78",
"EndpointID": "2dae4a431efd76066081424e47a7e6bc53e4102b14bf36bbdfda34492efd6369",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
完整阅读