存储
- config map,相当于配置中心,当config map 发生改变了,所有引用这个的pod的配置都发生改变
- 根据文件创建 kubectl create configmap game-config --from-file=filepath , 键名为文件名,键值为文件内容
- 根据字面值创建, kubectl create configmap special-config --from-literal=special.how=very --from-literal=xx=x
apiVersion: v1
kind: ConfigMap
metadata:
name: xx
data:
x: x
xx: xx
# 使用
spec:
containers:
env:
- name: test-container
image: xx
command: x
env:
- name: xxx
valueFrom:
configMapKeyRef:
name: special-config
key: special.how
envFrom:
- configMapRef:
name: env-config
spec:
containers:
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap: # 这里也可以是secret
name: special-config # configmap的名字
可以发现,键名为文件名,键值为文件内容
- configMap 热更新 kubectl edit configmap log-config(configmap 名),修改后,容器内的文件就会对应发生修改
- secret三种类型 service account,集群内的用户,会放在pod的/run/secrets/kubernetes.io/serviceaccount; opaque base64的secret;kubernetes.io/dockerconfigjson 用来存储docker私有仓库的认证信息
apiVersion: v1
kind: Secret
metadata:
nmae: mysecret
type: Opaque
data:
password: base64的内容
username: base64的用户名
- kubectl create secret docker-registry myregistrykey --docker-server=docker hub server --docker-usernmae=docker_user --docker-password=docker_pass --docker-email=xx 创建docker 镜像仓库登录的信息
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- nmae: foo
image: roc/awantyang:v1
imagePullSecrets: # docker 登录的账密
- name: myregistrykey
挂载类型
- empty dir
- hostpath 只要文件系统能在pod中创建容器,就可以使用其云存储,某些目录可能没有权限写入,需要把主机目录的权限修改成k8s运行的属组,或者是改成任何用户可读写的权限,或者是k8s以root运行,则不需要修改
- pv和pvc,创建pod的时候,声明一个pvc,然后pvc会根据配置寻找相关的pv,进行绑定,pv有独立的生命周期,pod重启后数据不丢失
- 静态pv和动态pv,静态pv是先创建好pv,等pvc调用,动态pv为,通过pvc进行动态的创建,一般用于云存储
- pv和pvc一一对应
apiVersion: v1
kind: persistentVolume
metadata:
name: nfspv
spec:
capacity:
storage: 1G
accessModes:
- ReadWriteOnce
storageClassName: nfs
persistentVolumeReclaimPolicy: Retain # 回收策略
nfs:
path: /nfs # nfs目录
server: 192.158.1.1 # nfs服务地址
调度过程
- 分为预选和优选
- 预选
- PodFitsResources,查看剩余的资源是否大于pod请求的
- PodFitsHost,查看nodename
- PodFitsHostPorts,已使用和申请的port是否匹配
- PodSelectorMathches,label的匹配情况
- NoDiskConflict mount的vol和pod指定的vol
- 如果没有合适的节点就会一直pending
- 优选
- LeastRequestedPriority 通过计算cpu和mem的使用率决定权重
- BalanceResourse
- 亲和和反亲和性,需要各个相关的pod对象运行于同一位置,这个同一位置使用topology key定义,将labelSelector中匹配的pod,部署到包含同一topology的区域内
污点与容忍度
- 使节点能够排斥一类特定的pod
- taint表示节点不能部署包含这个taint的pod,如果pod上有toleration则表示,这个pod调度到具有匹配的taint节点上。即为我能容忍这个污点,可以往上部署
- 污点是设置在node上的,容忍度是设置在pod上的
- NoSchedule,表示k8s不会将pod调度到具有该污点的node上
- PreferNoSchedule 避免调度到有这个污点的node上
- NoExecute 不会调度到node上,并且,已经部署的pod,也会驱逐
- 设置污点 kubectl taint nodes node1 key1=value1:NoSchedule
- 去除污点 kubectl taint nodes node1 key1:NoSchedule-
- 可以使用NodeName和NodeSelector来决定pod部署的node
# 容忍度配置
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
tolerationSeconds: 3600
key、value、effect要与node上设置一致,,tolerationSeconds用于描述当Pod需要被驱逐时可以在Pod上继续保留运行的时间。不指定key和effect表示容忍所有key和effect
有多个master时,可以设置尽量不在这上面执行,kubectl taint nodes Node-name node-role.kubernetes.io/master=:PreferNoSchedule
helm
- k8s的应用管理,能动态生成k8s资源清单文件。自动执行k8s资源部署
- 包含chart和release,chart是应用信息合集,包括配置模板、参数定义、依赖关系、文档说明等;chart每次运行就是个release,chart可以多次安装到同一集群,生成多个release
helm安装
- elf文件,软连到/usr/bin 下即可
- 创建sa,用于helm
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apigroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
- helm init --service-account tiller --skip-refresh 配置helm使用的sa
helm自定义模板
- 创建文件夹
- 创建爱你chart.yaml
# Chart.yaml
name: hello-world
version: 1.0.0
# 创建模板文件 templates/deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 1
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: xx
ports:
- containerPort: 8080
protocol: TCP
# 创建svc配置 templates/service.yaml
- helm install
- helm list 列出所有release
- helm upgrade xxx 更新,会自动实现升级
- helm history 查看历史版本
- helm status name 查看信息
- heml delete xxx 移除release,软删除
- helm rollback xx 版本 回滚
- helm delete --purge release_name 移除所有指定release的k8s资源及记录,硬删除
- helm list --deleted 查看软删除的内容
- 通过配置修改chart
# values.yaml
image:
repository: xx
tag: xx
# 模板中使用。VAlues对象访问
image: {{.Values.image.repositoiry}}:{{.Values.image.tag}}
- 也可以通过helm install --set image.tag='latest' 进行设置 或者helm install --values values.yaml 指定文件引入
- 测试是否可以创建 helm install --try-run
dashboard可视化配置管理
- helm fetch stable/kubernetes-dashboard
- helm install stable/kubernetes-dashboard -n kubernetes-dashboard --namespace kube-system -f kubernetes-dashboard.yaml
- 访问需要用kube/config文件或者是导入一个token,kubectl -n kube-system get secret | grep dashboard-token 得到名字,然后kubectl describe secret name
集群监控
- kubectl top node/pod 查看节点的top情况,需要kubernetes或者metric 插件支持
- prometheus有自己DSL语言
- 可视化监控界面 grafana
动态伸缩
- kubectl run php-apache --image=xxx --requests=cup=200m --expose --port=80 限制运行的cpu
- kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10 最少一个,最多10个
资源限制
- request为初始化大小,limit是限制
spec:
containers:
- image: xxx
imagePullPolicy: Always
name: auth
ports:
- containerPort: 80
protocol: TCP
resources:
limits:
cpu: "100m"
memory: "2g"
- quota, 资源限制的合集
apiVersion: v1
kind: ResourceQuota
metadata:
name: c
namespace: s
spec:
hard:
pods: "20" # 20个pod的总资源限制 只能创建20个pod
requests.cpu: "2"
requests.memory: 100G
limits.cpu: 40
limits.memory: 200G
configmaps: 10 # 只能创建10个config map
persistentvolumeclaims: 3 # pvc格式
secrets: 10
services: 10
services.loadbalancers: 3 # LB个数
- pod创建如果没有限制资源,则会使用ns下的最大资源,如果ns也没有限制,则使用集群的最大资源,使用limitRange设置默认值
kind: LimitRange
spec:
limits:
- default:
memory: 100G
cpu: 5
defalutRequest:
memeory: 10G
cpu: 1
type: Container # 定义为容器的默认值
efk
- es fluentd k
k8s高可用
- controller Schedule 如果存在多个,只有一个工作,其他挂起,自动实现了高可用
- etcd会形成集群部署,实现高可用
- 方案,冗余部署nginx或者ha等负载均衡器,发往apiserver的请求都经过负载均衡器的代理,实现多个apiserver的高可用
安全
- http token,token放在header中去请求api server,token对应的用户名放在apiserver可以访问你的文件里
- http base
- https 双向认证,客户端和服务端分别向api server申请ca证书,进行tls的双向认证
- 需要认证的资源
- 默认情况下,通过127.0.0.1进行本机访问的,不是用https,可以在配置里进行关闭
- kubectl kubelet kubeproxy 外部王文需要双向认证
- kubeconfig为集群的配置文件,包含集群参数,ca证书,apiserver 地址,客户端参数,集群context信息,kubernetes启动时指定不同的kubeconfig文件切换不同的集群
- pod动态创建,如果使用证书会频繁申请创建证书,所以pod使用sa进行访问