基础
基础设施的迭代
可以理解为 IAAS 是一个基础设施的服务,提供了基础设施的服务,比如虚拟机,网络,存储等等,比如基于OpenStack,云服务器,云硬盘,云数据库等等。
可以理解为 PAAS 是一个平台的服务,提供了平台的服务,比如开发平台,运行平台,测试平台等等,比如Kubernetes,Swarm,Apache Mesos等等。
租户隔离共用一个软件
kubernetes优势
- 服务发现和负载均衡
- 存储编排(添加任何本地或云存储系统)
- 自动部署和回滚
- 自动分配CPU和内存 -弹性伸缩
- 自我修复
- Secret和配置管理
- 大型规模的支持
- 开源
Pod概念
Pod是一个逻辑概念,是一组容器的集合,是最小调度单位
一个Pod内的容器与Pause容器共享名字空间(Network,PID,IPC),Pause容器是一个占位容器,不做任何事情,只是为了让Pod内的其他容器能够共享网络和存储卷等资源。
Kubernetes网络模型
CNI (Container Network Interface)
CNI是一个规范,定义了容器网络的接口,Kubernetes使用CNI来实现容器网络。


calico架构
calico架构图
1.Felix
- 管理网络接口
- 编写路由
- 编写ACL(访问控制列表)
- 报告状态
2.bird
- BGP Client将通过BGP协议广播告诉剩余calico节点,从而实行网络互通
3.confd
- 通过监听etcd以了解BGP配置和全局默认值的更改,Confd根据ETCD中的数据的更新,动态生成BIRD配置文件,当配置文件更改时,confd触发BIRD重新加载新文件
calico网络模型
VXLAN
VXLAN 即Virtual eXtensible Local Area Network,是一种虚拟化技术,用于在二层网络上建立逻辑二层网络,从而实现跨主机的二层网络通信。
是Linux本身支持的一种网络虚拟化技术,VXLAN可以完全在内核态实现封装和解封装,从而通过隧道机制,构建出覆盖网络
数据包封包:在vxlan设备上将pod发来的数据包源、目的mac替换为本机vxlan网卡和对端节点vxlan网卡的mac,外层udp目的ip地址根据路由和对端vxlan的mac查fdb表获取
优势:只要k8s三层节点互通,可以跨网段,对主机网关路由没有特殊要求,各个node节点通过vxlan设备实现基于三层的二层互通
基于三层的“二层”通信,即vxlan包封装在udp数据包中,要求udp在k8s节点间三层可达;二层即vxlan封包的源mac地址和目的mac地址是自己的vxlan设备mac和对端vxlan设备mac实现通讯
缺点:封包和解包会存在一定的性能损耗

vxlan底层封装模型

在calico中使用vxlan

IPIP
数据包封包:在tunl0设备上将pod发来的数据包源、目的mac替换为本机tunl0网卡和对端节点tunl0网卡的mac,外层数据包目的根据路由得到
解包和封包会存在一定性能损耗
- Linux原生支持
- IPIP隧道的工作原理是将源主机的IP数据包封装在一个新的数据包中,新的IP数据包的目的地址是隧道的另一端,在隧道的另一端,接受方将解封原始IP数据包,并将其传递给目的主机
IPIP隧道可以在不同网络之间建立连接,例如在IPv4网络和IPv6网络之间建立连接,或者在不同的IPv4网络之间建立连接

BGP
边界网关协议(Border Gateway Protocol,BGP)是互联网上一个核心的去中心化自治路由协议,它通过维护IP路由表或“前缀”表来实现自治系统之间的可达性,属于矢量路由协议

BGP
- 数据包封包:不需要进行数据包封包
- 优点: 不用封包解包,通过BGP协议可实现pod网络在主机间的三层可达
- 缺点:跨网段时,配置较为复杂网络要求高,主机网关路由也需要充当BGP Speaker
配置方法

Kubernetes安装
安装方式
kubeadm
组件通过容器化方式运行
优势
缺点
二进制安装
组件变成系统进程的方式运行
优点
K8s资源清单
资源类别
- 名称空间级别
- 工作负载型资源:Pod,ReplicaSet,Deployment
- 服务发现及负债均衡型资源: Service,Ingress…
- 配置与存储型资源: Volume,CSI
- 特殊类型的存储卷: ConfigMap,Secret
- 集群级资源
- Namespace,Node,ClusterRole,ClusterRoleBinding
- 元数据型资源
- HPA,PodTemplate,LimitRange
资源清单结构

- apiVersion: 资源类型的API版本
- kind: 资源类型
- metadata: 元数据
- name: 资源名称
- namespace: 资源所在的名称空间,默认为default
- labels: 资源标签
- spec: 资源规格(期望)
*
- status: 资源状态(实际)(由K8s管理)
kubectl apiversions
查看支持的API版本
kubectl explain [资源类型]
查看资源清单结构
还可以查询子对象,如kubectl explain pod.spec.containers
创建一个pod
kubectl create -f demo.yaml
查看pod
kubectl get pods
删除一个pod
kubectl delete -f demo.yaml
容器排错
查看pod详细信息
kubectl describe pod pod-demo-1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
Name: pod-demo-1
Namespace: default
Priority: 0
Service Account: default
Node: k8sn1/192.168.17.12
Start Time: Fri, 24 Jan 2025 10:53:07 +0800
Labels: app=myapp
Annotations: cni.projectcalico.org/containerID: 29e078e4c8430c6c13e3dd591c9c75ecbc41a3d1a8e80b0266d972ef4ede5bb2
cni.projectcalico.org/podIP: 10.244.203.0/32
cni.projectcalico.org/podIPs: 10.244.203.0/32
Status: Pending
IP:
IPs: <none>
Containers:
myapp-1:
Container ID:
Image: wangyanglinux/myapp:v1.0
Image ID:
Port: <none>
Host Port: <none>
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-fdbt2 (ro)
myapp-2:
Container ID:
Image: wangyanglinux/myapp:v2.0
Image ID:
Port: <none>
Host Port: <none>
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-fdbt2 (ro)
Conditions:
Type Status
PodReadyToStartContainers False
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
kube-api-access-fdbt2:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 5m28s default-scheduler Successfully assigned default/pod-demo-1 to k8sn1
Normal Pulling 5m27s kubelet Pulling image "wangyanglinux/myapp:v1.0"
Normal Pulled 4m22s kubelet Successfully pulled image "wangyanglinux/myapp:v1.0" in 1m4.799s (1m4.799s including waiting)
Normal Created 4m22s kubelet Created container myapp-1
Normal Started 4m22s kubelet Started container myapp-1
Normal Pulling 4m22s kubelet Pulling image "wangyanglinux/myapp:v2.0"
Normal Pulled 4m13s kubelet Successfully pulled image "wangyanglinux/myapp:v2.0" in 8.825s (8.825s including waiting)
Normal Created 3m25s (x4 over 4m13s) kubelet Created container myapp-2
Normal Started 3m25s (x4 over 4m13s) kubelet Started container myapp-2
Normal Pulled 2m29s (x4 over 4m10s) kubelet Container image "wangyanglinux/myapp:v2.0" already present on machine
Warning BackOff 26s (x17 over 4m7s) kubelet Back-off restarting failed container myapp-2 in pod pod-demo-1_default(505b2c03-871d-44f0-ad21-018fff0f3a3b)
|
主要看Events: k8s调度的过程事件
kubectl logs pod-demo-1 -c myapp-1
查看容器日志
Pod的生命周期


initC
init容器与普通的容器非常像,除了以下两点
- init容器总是运行到成功完成为止
- 每个init容器都必须在下一个init容器启动之前成功完成
如果Pod的init容器失败,k8s会不断的重启该Pod,知道init容器成功为止,然而如果Pod对应的restartPolicy为Never,它不会重新启动
检测initC的阻塞性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
apiVersion: v1
kind: Pod
metadata:
name: initc-1
labels:
app: initc
spec:
containers:
- name: myapp-container
image: wangyanglinux/tools:busbox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: wangyanglinux/tools:busybox
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: wangyanglinux/tools:busbox
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
|