Kubernetes基本概念的学习
Master节点:整个集群的控制中枢
Master节点有以下组件:
Kube-APIServer:各个模块之间信息交互都需要通过Kube-APIserver,同事他也是集群管理,资源配置,整个集群安全机制的入口;
ControllerManager:集群状态管理器,保证Pod或其他资源达到期望值,也是需要和APIServer进行通信,在需要的时候创建,更新或者删除它锁管理的资源,比如一个服务创建了5个副本,更新的时候需要增加一个,APIServer就会通知ContrllerManager增加一个副本;
Scheduler:集群的调度中心,他会根据一系列的条件,选择一个或者一批节点,然后部署我们的Pod。
Etcd:后端存储,键值数据库
Node节点:工作节点
kubelet:负责监听节点上的Pod状态,同时上报节点和节点上的Pod状态,负责与Master节点通信,并管理节点上面的Pod。
KubeProxy:负责Pod之间的通信,将指定的流量分发到后端正确的机器上。
查看proxy的工作端口:
[root@master01 ~]# netstat -ntlp | grep kube-proxy tcp 0 0 0.0.0.0:30004 0.0.0.0:* LISTEN 4226/kube-proxy tcp 0 0 0.0.0.0:30587 0.0.0.0:* LISTEN 4226/kube-proxy tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 4226/kube-proxy tcp6 0 0 :::10256 :::* LISTEN 4226/kube-proxy
查看proxy的工作模式
[root@master01 ~]# curl 127.0.0.1:10249/proxyMode iptables
ipvs:(内核级别的转发)监听Master节点,增加和删除service以及endpoint的消息。调用Netlink接口,创建响应的IPVS规则,通过ipvs规则将流量转发到响应的pod上。
查看ipvs的规则
[root@master01 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
iptables:监听Master节点,增加和删除service以及endpoint的消息,对于每一个service,他都会场景一个iptables,将service的clusterIP代理到后端对应的Pod。
Calico: 符合CIN标准的网络组件。 给每个pod生产一个唯一的ip,并且把每个节点当作一个路由器;
CoreDNS:用于kubernetes集群内部的Service解析,可以让Pod把service名称解析成为IP地址,然后通过service的IP地址连接到对应的应用上。
[root@master01 ~]# kubectl get svc -n kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.1.0.10 <none> 53/UDP,53/TCP,9153/TCP 27d
Docker容器引擎:容器引擎,对容器进行管理。
一、基本资源概念
kubernetes是以namespace隔离的,查看namespace
[root@master01 ~]# kubectl get namespace NAME STATUS AGE default Active 27d jna Active 20d kube-node-lease Active 27d kube-public Active 27d kube-system Active 27d kubernetes-dashboard Active 27d
查看系统的namespace下的pod
[root@master01 ~]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-577f77cb5c-twhgv 1/1 Running 12 26d calico-node-5k47s 1/1 Running 13 27d calico-node-n9kvg 1/1 Running 13 27d calico-node-rbpkm 1/1 Running 13 27d coredns-6d56c8448f-bhsbd 1/1 Running 12 26d coredns-6d56c8448f-xkpnt 1/1 Running 12 26d etcd-master01 1/1 Running 13 27d kube-apiserver-master01 1/1 Running 14 27d kube-controller-manager-master01 1/1 Running 16 27d kube-proxy-mlwjh 1/1 Running 13 27d kube-proxy-pzglf 1/1 Running 13 27d kube-proxy-xfb2l 1/1 Running 15 27d kube-scheduler-master01 1/1 Running 15 27d
1 POD: k8s最小部署单元,有一个或者一组容器的集合;每个pod还包含了一个pause容器,pause容器是每个pod容器的父容器,主要负责僵尸容器的回收管理,通过这个容器可以使同一个Pod的里边的多个容器共享存储、网络、PId、IPC
[root@master01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE web-96d5df5c8-lfbgg 1/1 Running 3 5d22h web-96d5df5c8-nf9tz 1/1 Running 3 5d22h web-96d5df5c8-tnzt4 1/1 Running 3 5d22h web2-5fc4444698-8h68t 1/1 Running 1 4d1h web2-5fc4444698-f99kz 1/1 Running 1 4d1h web2-5fc4444698-jlsp2 1/1 Running 1 4d1h
2 Deployment:最常见的控制器,用于更高级别的部署和管理Pod,滚动升级,副本的管理,回滚
用于部署无状态的服务,这个最常用的控制器,一般用于管理维护企业内部无状态的微服务、比如configserver、zuulspringboot。可以管理多个副本的Pod,实现无缝迁移,自动扩容缩容、自动灾难恢复,一键回滚的功能。
[root@master01 ~]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE web 3/3 3 3 5d22h web2 3/3 3 3 4d1h
3 Service:为一组Pod提供负载均衡,对外提供统一访问入口
[root@master01 ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 6d21h web NodePort 10.1.156.192 <none> 80:31614/TCP 5d22h web2 NodePort 10.1.249.74 <none> 80:30209/TCP 35m
4 Label:标签,附加到某个资源上,用于关联对象,查询和筛选
5、Namespaces:命名空间、将资源对象逻辑上隔离、从而形成多个虚拟集群,也利于权限控制。
5.1 应用场景:
.根据不同端对换房命名空间
.根据项目划分命名空间
[root@master01 ~]# kubectl get namespace NAME STATUS AGE default Active 6d22h kube-node-lease Active 6d22h kube-public Active 6d22h kube-system Active 6d22h kubernetes-dashboard Active 6d19h
.default:默认命名空间
.kube-system:K8s系统方面的命名空间
.kube-public:公开命名空间,谁都可以访问,
.kube-node-lease:K8s内部命名空间
5.2 -n参数可以查看指定命名空间下的pod
[root@master01 ~]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-577f77cb5c-twhgv 1/1 Running 4 6d2h calico-node-5k47s 1/1 Running 5 6d20h calico-node-n9kvg 1/1 Running 5 6d20h calico-node-rbpkm 1/1 Running 5 6d20h coredns-6d56c8448f-bhsbd 1/1 Running 4 6d2h coredns-6d56c8448f-xkpnt 1/1 Running 4 6d2h etcd-master01 1/1 Running 5 6d22h kube-apiserver-master01 1/1 Running 5 6d22h kube-controller-manager-master01 1/1 Running 5 6d22h kube-proxy-mlwjh 1/1 Running 5 6d22h kube-proxy-pzglf 1/1 Running 5 6d22h kube-proxy-xfb2l 1/1 Running 5 6d22h kube-scheduler-master01 1/1 Running 5 6d22h
5.3 创建命名空间
[root@master01 ~]# kubectl create namespace jna namespace/jna created [root@master01 ~]# kubectl get namespace NAME STATUS AGE default Active 6d23h jna Active 8s kube-node-lease Active 6d23h kube-public Active 6d23h kube-system Active 6d23h kubernetes-dashboard Active 6d20h
5.4 在指定的命名空间中创建pod
[root@master01 ~]# kubectl create deployment web --image=nginx --replicas=2 -n jna deployment.apps/web created
get pod是默认的namespace看不到刚才创建的
[root@master01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE web-96d5df5c8-lfbgg 1/1 Running 3 5d23h web-96d5df5c8-nf9tz 1/1 Running 3 5d23h web-96d5df5c8-tnzt4 1/1 Running 3 5d23h web2-5fc4444698-8h68t 1/1 Running 1 4d2h web2-5fc4444698-f99kz 1/1 Running 1 4d2h web2-5fc4444698-jlsp2 1/1 Running 1 4d2h
查看指定的namespace
[root@master01 ~]# kubectl get pod -n jna NAME READY STATUS RESTARTS AGE web-96d5df5c8-68f4z 1/1 Running 0 19s web-96d5df5c8-v6wm7 1/1 Running 0 19s
5.6 在yaml中指定namespace
apiVersion: v1 kind: Service metadata: name: web2 namespace: jna spec: selector: app: nginx2 ports: - protocol: TCP port: 80 targetPort: 80 type: NodePort
创建service
[root@master01 ~]# kubectl apply -f service2.yaml
service/web2 created
查看指定namespace下的pod和service
[root@master01 ~]# kubectl get pod,service -n jna NAME READY STATUS RESTARTS AGE pod/web-96d5df5c8-68f4z 1/1 Running 0 18m pod/web-96d5df5c8-v6wm7 1/1 Running 0 18m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/web2 NodePort 10.1.252.146 <none> 80:31741/TCP 2m7s
查看日志的时候也要加对应的-n jna
[root@master01 ~]# kubectl logs web-96d5df5c8-68f4z -n jna /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
yaml文件编写apiVersion: v1 #必选,API的版本号
kind: Pod #类型Pod metadata: #元数据 name: nginx #pod名称, 符合RFC 1035规范的Pod名称 namespace: default #Pod的命名空间,不指定是default,可以使用-n参数指定
lables: #可选,标签选择器,一般用于过滤和区分Pod
app: nginx
role: frontend
annotations: #添加注释,比如版本的修改等信息
app:nginx
spec: #必选,用于定义容器的详细信息
initContainers: #初始化容器,在容器启动之前执行一些初始化操作
- command
- sh
- -c
- echo "I am Inicontainer for init some configuration"
image: busybox
imagePullPolicy: IfNotPresent
name: init-container
containers: #必选,容器列表
- name: nginx #容器名称
image: nginx:1.15.2 #容器你高兴的地址
imagePullPolicy: Always #拉去镜像的策略,IfNotPresent:如果宿主机有镜像,不需要在拉去,Always:总是拉去
command: #容器启动执行的命令
- nginx
- -g
workingDir: /usr/share/nginx/html #工作目录
volumeMounts: #kexuan,存储卷名称,可以配置多个
- name: webroot #存储卷名称
mountPath: /usr/share/nginx/html #挂载目录
readOnly: true #只读
ports: #可选,容器需要暴露的端口号列表
- name: http #端口名称
containerPort: 80 #端口号
protocol: TCP # 端口协议,默认TCP
env: 可选,环境变量配置列表
- name: TZ #变量名称
value: Asia/Shanghai #变量的值
- name: LANG
value: en_US.utf8
resources: #可选,资源限制和资源请求
limits: #最大限制设置
cpu: 1000m
memory: 512Mi
restartPolicy: Always #可选,末日人为Always。容器故障或者没有启动成功,就自动重启该容器,onfailure:容器不为0的状态为止
imagePullSecrets: #可选,拉取镜像的secret,可以使用多个
查看容器的标签:
[root@master01 ~]# kubectl get node --show-labels NAME STATUS ROLES AGE VERSION LABELS master01 Ready master 27d v1.19.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master01,kubernetes.io/os=linux,node-role.kubernetes.io/master= work01 Ready <none> 27d v1.19.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=work01,kubernetes.io/os=linux work02 Ready <none> 27d v1.19.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=work02,kubernetes.io/os=linux
创建新的namespace
[root@master01 ~]# kubectl create namespace nsname namespace/nsname created
六、Pod探针
StartupProbe:k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动,如果配置了startupProbe,就会禁止其他的探测,直到他成功位置,成功后将不在进行探测;
LivenessProbe:用于探测容器是否运行,如果探测失败,kubelet会根据配置的重启策略进行响应的处理,若没有配置该探针,默认就是success。
ReadinessProbe: 一般用于探测容器内的程序是否健康。
探针的检测方式
ExecAction:在容器内执行一个命令,如果返回值为0,则认为容器健康。
TCPSocketAction: 通过TCP连接检查容器内的端口是否是通的,如果是通的就认为容器健康。
HTTPGetAction:通过应用程序暴露的API地址来检查程序是否是正常的,如果状态码200~400之间,则认为容器健康,
查看容器自带的LivenessProbe:
[root@master01 ~]# kubectl edit deploy coredns -n kube-system
livenessProbe:
failureThreshold: 5
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
name: coredns
ports:
- containerPort: 53
name: dns
protocol: UDP
- containerPort: 53
name: dns-tcp
protocol: TCP
- containerPort: 9153
name: metrics
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /ready
port: 8181
scheme: HTTP
七、Statefulset的基本概念
StatefulSet(有状态集,缩写为sts)常用于部署有状态的且有序启动的应用程序,比如在进行SpringCloud项目容器化时候,Eureka的部署是比较合适用StatefulSet部署方式的,可以给每个Eureka实例创建一个唯一且固定的标识符,并且每个Eureka实例无需配置多余的Service,其余SpringBoot应用可以直接通过Eureka的HeadlessService即可进行注册。
StatefulSet主要用于管理有状态应用程序的工作负载API对象,比如生产环境中,可以部署Elasticsearch集群、MongDB集群或者需要持久化的RabbitMQ集群、Redis集群、Kafka集群和ZooKeeper集群等。
Service:headless service,没有ClusterIP
和Deployment类似,一个StatefulSet也同样管理着基于相同容器规范的Pod。不同的是StatefulSet为每个Pod维护了一个粘性标识。这些Pod是根据相同的规范创建的,但是不可互换,每个Pod都有一个持久的标识符,在重新调度时候也会保留,一般格式为StatefulSetName-Number。
一般StatefulSet用于一下啊一个多个需求的应用程序:
需要稳定的独一无二的网络标识符;
需要持久化数据;
需要有序的,优雅的部署和扩展;
需要有序的自动滚动更新;
创建一个StatefulSet
apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi
创建一个statefulset
[root@master01 ~]# vi statefulset.yaml [root@master01 ~]# [root@master01 ~]# kubectl create -f statefulset.yaml service/nginx created statefulset.apps/web created
查看statefulset
[root@master01 ~]# kubectl get statefulset NAME READY AGE web 0/2 47m
Statefulset的删除
级联删除:删除Statefulset的时候,删除Pod
[root@master01 ~]# kubectl delete statefulset web
非级联删除: 删除Statefulset的时候,删除Pod
[root@master01 ~]# kubectl delete statefulset web --cascade=false
8、DaemonSet
DaemonSet:守护进程集,缩写为ds,在所有节点或者是匹配的节点都部署一个Pod。
运行集群存储的daemon,比如ceph或者qlusterd,节点的CNI网络插件,calico;
节点日志的收集:fluentd或者是filebeat;
节点的监控:node export
服务暴露:部署一个 ingresss nginx
编写yaml,kind改为DaemonSet
apiVersion: v1
kind: DaemonSet
metadata:
name: nginx
labels:
app: nginx
查看系统的daemonset
root@master01 ~]# kubectl get daemonset -n kube-system NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE calico-node 3 3 0 3 0 kubernetes.io/os=linux 32d kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 32d
9、Label和Selector
Label:对k8s中各种资源镜像分类、分组,添加一个具有特别属性的一个标签。
Selector:通过一个过滤的语法镜像查找到对应标签的资源。
给一个node打标签
[root@master01 ~]# kubectl label node work01 region=subnet6
node/work01 labeled
过滤这个标签
[root@master01 ~]# kubectl get node -l region=subnet6 NAME STATUS ROLES AGE VERSION work01 Ready <none> 33d v1.19.0
查看打的标签
[root@master01 ~]# kubectl get node --show-labels NAME STATUS ROLES AGE VERSION LABELS master01 Ready master 33d v1.19.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master01,kubernetes.io/os=linux,node-role.kubernetes.io/master= work01 Ready <none> 33d v1.19.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=work01,kubernetes.io/os=linux,region=subnet6 work02 Ready <none> 33d v1.19.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=work02,kubernetes.io/os=linux
给pod打标签
[root@master01 ~]# kubectl label pod busybox app=busybox
删除标签:
[root@master01 ~]# kubectl label busybox app-
修改标签:
[root@master01 ~]# kubectl label pod busybox app=busybox2 --overwrite
10、Kubernetes涉及的网络
网络架构