概念
kubernetes
是个高度自动化的资源控制系统。跟踪对比etcd
库里保存的资源期望状态
与当前环境中实际资源状态
差异来实现自动控制和自动纠错的高级功能。
Master
Node
kubectl get pods
kubectl describe node 127.0.0.1
Pod
对应一组容器。
pod
出现原因
- 解决业务容器是否有效,通过业务无关且不容易死亡的
Pause
容器作为根容器(一个容器死亡算整体死亡吗?) - 解决多个业务容器共享
Pause
容器的IP
,简化业务容器直接通信问题
资源限制
spec:
containers:
- name: myweb
image: kubeguide/tomcat-app:v1
resources:
requests: # 资源的最小申请量
memory: "64Mi" # 单位是内存字节数
cpu: "250m" # 千分之一的最小配额。即0.25个cpu
limits: # 资源最大允许使用量
memory: "128Mi"
cpu: "500m" # 0.5个cpu
ports:
- containerPort: 8080
-
Replication Controller
与
Replication Set
区别:RS
基于支持集合的selector
实现应用集群的高可用性。根据
selector
确保某个标签的pod
数量符合预期值。-
RC
设置pod
的副本数,实现pod
的扩容或缩容 -
RC
设置pod
的镜像版本,实现pod
的滚动升级
kubectl scale rc myweb --replicas=3 # 动态缩放pod的数量
-
-
Deployment
内部使用
Replication Set
tomcat-depolyment.yaml
文件apiVersion: extensions/v1beta1 kind: Deployment metadata: name: frontend spec: replicas: 1 selector: matchLabels: # 基于集合的标签匹配 tier: frontend matchExpressions: - { key: tier, operator: In, values: [frontend]} template: metadata: labels: app: app-demo tier: frontend spec: containers: - name: tomcat-demo image: tomcat imagePullPolicy: IfNotPresent ports: - containerPort: 8080
查看
Deployment
信息# kubectl get deployments 动态看到pod水平扩展过程 NAME DESIRED(期望) CURRENT(当前) UP-TO-DATE(滚动成功) AVAILABLE AGE frontend 1 1 1 0 3m # kubectl get rs NAME DESIRED CURRENT READY AGE frontend-141477217 1 1 0 3m
-
Horizontal Pod Autoscaler
水平自动伸缩
pod
谷歌大神觉得分布系统要能够根据当前负载变化情况自动触发水平扩展或缩容行为。HPA
衡量pod
的指标:CPUUtilzationPercentage
;应用程序自定义的度量指标,如服务的TPS
或QPS
cpu
利用率:pod
自身的是当前cpu
的使用量除以request
数CPUUtilzationPercentage
:1分钟内pod
的cpu
使用量的平均值HPA
定义horizontal-pod-autoscaler.yml
文件apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: frontend namespace: default spec: maxReplicas: 10 minReplicas: 1 scaleTargetRef: # HPA控制的目标对象名为frontend的Deployment的所有pod实例 kind: Deployment name: php-apache targetCPUUtilizationPercentage: 90 # 当Pod的副本cpu超过90%时介于1~10间扩容缩容
命令
kubectl autoscale deployment frontend --cpu-percent=90 --min=1 --max=10
-
StatefulSet
kubernets
中pod
管理对象RC、Deployment、DaemonSet、Job
都是面向无状态服务。但MySQL、MongoDB
等是有状态。无状态时可以自由重启,随机分配。有状态则被限制。
-
StatefulSet
每个pod
都有稳定的网络标识 - 采用稳定的持久化存储卷
- 启停顺序受控制
- 每个
pod
有对应的DNS
解析
-
Service
kubernetes
的service
对应服务架构的一个微服务,由一组Pod
副本组成的集群实例。
service
和pod
的关联通过Label Selector
来实现无缝对接。
RC
保证Service
的服务能力和服务质量处于预期。
kubectl get endpoints # 查看服务对应的pod实例信息
kubectl get svc myweb -o yaml # 查看服务的详细信息
-
一个服务多端口
给每个端口命名,用于
kubernetes
服务发现机制。myweb-svc.yml
文件apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 name: service-port - port: 8085 name: shutdown-port selector: app: myweb
-
kubernetes
的服务发现机制一般分布式系统提供特定
API
接口实现服务发现的功能,平台入侵性强。kubernetes
通过Add-on
增值包的方式引入DNS
系统,把服务名作为DNS
域名,程序与服务直接建立通信
三类IP
地址
-
Node IP
:集群中Node
节点的物理网卡IP
,真实物理网络 -
Pod IP
:Docker Engine
网桥分配的IP
地址,虚拟二层网络 -
Cluster IP
:伪造的虚拟IP
,无法ping
,须结合service port
结合
问:外部怎么访问kubernetes
集群内部?
答:采用NodePort
解决。
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort # 注意
ports:
- port: 8080
nodePort: 30001 # NodeIP+NodePort访问
selector:
app: myweb
Volume
pod
中能被多个容器访问的共享目录。
-
k8s
的volume
定义在pod
上,一个pod
的多个容器挂载到具体目录 -
k8s
的volume
生命周期与pod
相同,但与容器生命周期无关 -
k8s
支持多种类型的volume
,如Ceph
、GlusterFs
-
emptyDir
:宿主机无对应目录,kubernetes
自动分配。用于临时目录 -
hostPath
:挂载宿主机上。用于应用程序的日志文件,永久保存的
-
使用
在Pod
声明Volume
———> 在容器里引用Volume
并挂载到某个目录
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql
spec:
replicas: 1
selector:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
volumes: # 定义pod的volume的名字及类型
- name: datavol
emptyDir: {} # empty
#volumes:
# - name: persistent-storgae
# hostPath: # hostPath
# path: "/data"
containers:
- name: mysql
image: mysql:5.6
volumeMounts:
- mountPath: /data
name: datavol # 根据pod的volume名挂载到容器内/data目录
ports:
- containerPort: 3306
Persistent Volume(PV)
网络存储是一种实体资源,独立于计算资源(CPU、内存
),故与pod
独立。
-
PV
只是网络存储,不属于任何Node
,每个Node
可访问 -
PV
独立于Pod
定义 -
PV
支持类型:NFS、RDB、HostPath(供单机测试)
状态:Available(可用)、Bound(已绑定到pvc)、Released(pvc已删除未回收)、Failed(pv回收失败)
使用
定义NFS
类型的PV
apiVersion: v1
kind: PersistentVolume # pv
metadata:
name: pv001
spec:
capacity:
storage: 5Gi # 5Gi的存储空间
accessModes:
- ReadWriteOnce # 读写权限,只能被单个Node挂载。 ReadOnlyMany、ReadWriteMany
nfs:
path: /data
server: 172.17.0.2
pod
要用pv
,需要先定义一个pvc
apiVersion: v1
kind: PersistentVolumeClaim # pvc
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
server: 172.17.0.2
pod
的volume
中用pvc
volumes:
- name: mypd
persistentVolumeCalim:
claimName: myclaim
Namespace
Namespace
是实现多租户的资源隔离,将集群内部资源对象分配到不同的Namespace
中,实现资源共享与管理。
kubernetes
集群默认创建default
的namespace
# kubectl get namespaces
NAME STATUS AGE
default Active 4d
kube-system Active 4d
使用
-
创建
namespace
# cat new-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: development # kubectl create -f new-namespace.yaml
-
资源对象使用
namespace
# cat ns-pod.yml apiVersion: v1 kind: Pod metadata: name: busybox namespace: development spec: containers: - image: busybox command: - sleep - "3600" name: busybox # kubectl create -f ns-pod.yml
-
查看
kubectl get pods # 默认查看default的命名空间的资源对象 kubectl get pods --namespace=development # 指定查看
Annotation
灵活的k/v
,用户自定义,便于查找与标记。
网友评论