pod的网络
- 每个容器的虚拟ip不能一样,可以将每个docker的网络设置成不一样来实现
- 同主机的pod通过docker0网桥互相访问
- 不同主机的pod,通过flannel网络进行转发,类似于vxlan,docker网桥数据发送到flannel的网桥,经过flanneld的处理,发送到目标主机,目标主机再去解包,发现需要转给的pod
- pod访问service,通过iptabels或者ipvs访问
k8s安装
- 配置成使用ipvs
apiVersion: kubeproxy.config.k8s.io/v1beta1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
- 修改deployment的replicaset数 kubectl scale --replicas=3 deployment/nginx-deployment
- 查看ipvs ipvsadm -Ln
yaml文件
- 可以使用双叹号标识强制类型转换!!str true
- 字符串双引号内的特殊字符不会被转义
- 单引号内还有单引号,使用双单引号进行转义
- 多行文本,换行时需要有缩进,也可以用|保留换行符,使用>折叠换行,|- 代表删除末尾换行符,|+ 保留结尾换行符
str: 这是一段
多行
字符串
this: |
Foo
Bar
that: >
Foo
Bar
yaml常用字段说明
- kubectl apiversion 查看version
- kind stirng 标识指定的资源类型和角色
- metadata
- metadata.name string 定义名字
- metadata.namespace string 所属命名空间
- spec object 对象详细信息
- spec.containers[]
- spec.containers[].name string 定义容器名
- spec.containers[].image string 定义容器使用的镜像
- spec.containers[].imagePullPolicy string always never ifnotpresent 镜像的拉去策略
- spec.containers[].command[] list 指定容器启动命令
- spec.containers[].args[]
- spec.containers[].workingDir string 指定容器的工作目录
- spec.restartPolicy string 重启策略
- spec.nodeSelector object 以key-value方式存储 label
- spec.imagePullSecrets object 定义pull镜像是使用的secret
- spec.hostNetwork bool 是否使用主机网络,默认false
使用kubectl explain pod 可以查看pod的yaml应该配置的字段,kubectl explain pod.apiVersion 这样可以看pod的apiVersion的定义
查看某个容器的日志 kubectl log my-pod -c test , 使用-c 指定要查看日志的容器
容器生命周期
- initC,初始化容器,可以有多个initc进程,但是不能并行执行
- start,容器启动
- readness, 容器是否就绪的检查
- liveness 容器存活检查
- stop,容器退出时需要执行的操作
使用initc检测依赖的容器
如果pod中两个容器相互依赖,可以使用initc来检测依赖容器是否启动了
spec:
containers:
- name: myapp-container
image: busybox
command: ["sh","-c","echo 1 && sleep 3600"]
initContainers:
- name: init-myservice
image: busybox
command: ["sh","-c","until nslookup service; do echo waiting for service; sleep 2;"]
- name: init-mydb
image: busybox
command: ["sh","-c","until nslookup mydb; do echo waiting for db; sleep 2;"]
如果使用latest版本,每次都会重新拉取镜像
- 在pod启动过程中,init容器会按顺序在网络和数据卷初始化后启动,每个容器必须在下一个容器启动之前成功退出
- 依赖容器检测,也可以使用readiness来做
探针
探针是kubelet对容器的检测
- 探针类型 livenessProbe。readinessProbe
- 探测方法 exec、tcpsocket、httpget
// 定义在pod yaml中
spec:
containers:
- name: readiness-httpget
image: wangyanglinux/myapp:v1
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:
port: 80
path: /index.html
initialDelaySeconds: 1 # 延迟1s执行
periodSeconds: 3 # 每3s检测一次
timeoutSeconds: 3
spec:
containers:
- name: readiness-httpget
image: wangyanglinux/myapp:v1
imagePullPolicy: IfNotPresent
livenessProbe:
exec:
command: ["test","-e","/tmp.live"]
initialDelaySeconds: 1
periodSeconds: 3
可以通过livenessProbe实现某个容器执行一段时间重新运行
启动、退出动作定义
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh","-c","echo hello from the post start handler > /var/log/msg"]
preStop:
exec:
command: ["/usr/sbin/nginx","-s","quit"] # 也可以为备份数据等
pod状态:pending、running、succeeded(所有容器都被成功终止,并不会再重启)、failed、unknown(无法获取状态,通常是和主机通信失败)
控制器
- replicaset
- deployment,它创建rs,然后rs创建pod,
- 滚动升级和回滚
- 扩缩容
- 暂停继续Deployment
- daemonset
- statefulset,稳定的持久化,稳定的标识,有序部署,有序收缩(部署逆序)
- job, 运行出错退出会重新执行
- cronjob,在特定时间自己创建job来执行
- hpa
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend # 选择frontend标签的
template: # 相当于嵌套的一个pod的配置
metadata:
labels:
tier: frontend
spec:
containers:
- name: php-redis
image: xx
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
- 标签修改 kubectl label pod frontend-xxx tier=frontend1
- kubectl get pod --show-labels
# deployment 创建
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
# revisionHistoryLimit: x 指定deployment保留多少revision历史,默认保留全部,设置为0则不能回滚
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.0
ports:
- containerPort: 80
- kubectl使用时,增加--record 可以记录下每次执行的命令,方便revision
- 创建deployment的时候会自动创建一个replicaSet
- 扩容 kubectl scale deployment nginx-deployment --replicas 10
- 镜像更新 kubectl set image xxx
nginx=nginx:1.9.1 nginx为容器,等号后为镜像版本,更新镜像会生成新的rs - 回滚 kubectl rollout undo deployment/nginx-deployment
- kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80 自动扩缩容
- 如果在pod创建过程中,修改image,会立即停止旧pod创建,然后去创建新pod
- 查看回滚状态 kubectl rollout status deployment/nginx-deployment, 可以通过这个命令的状态值来判断是否回滚完成 $?为0 则完成了
- 查看历史版本 kubectl rollout history deployment/nginx-deployment
- 指定回滚版本 undo 增加参数 --to-revision=x
- 暂停更新或者回滚 kubectl rollout pause deployment/nginx-deployment
# daemonset 会在每个node上创建pod
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: deamonset-example
labels:
app: daemonset
spec:
selector:
matchLabels:
name: deamonset-example
template:
metadata:
labels:
name: deamonset-example
spec:
containers:
- name: daemonset-example
image: xxx
# job
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
metadata:
name: pi
spec:
containers:
- name: pi
image: perl
command: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"]
restartPolicy: Never # 有never和onfailure两个
# completions: 1 # 标志job结束时需要成功运行的pod个数,默认1
# parallelism: 1 标志并行运行的pod个数,默认1
# activeDeadlineSeconds: 10 # 标志失败pod的重试最多打时间,超过这个时间不会继续重启
# cronjob
apiVersion: batch/v1
kind: CronJob
metadata:
name: p
spec:
# startingDeadlineSeconds: 19 # 启动job 的时间,如果这个时间内,job还没执行完,则为失败
# concurrencyPolicy: allow # 并发策略,有allow forbid禁止并发 replace取消当前正在运行的job,用新的替换
# suspend: true
# successfulJobsHistoryLimit: # 成功的历史,默认3
# failedJobsHistoryLimit # 失败的历史,默认1
schedule: "*/1 * * * *" # 同crontab
jobTemplate:
spec:
template:
metadata:
spec:
containers:
- name: pi
image: perl
command: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"]
restartPolicy: Never # 有never和onfailure两个
cronjob没有成功失败的概念,只会定期的调度job,需要看job的成功失败
service
- 根据label匹配一组pod
- 四种模式
- clusterIp,默认类型,自动分配一个cluster内部可以访问的虚拟ip地址,用于不同pod之间访问
- nodeport,在clusterip的基础上,为每个机器绑定一个端口,可以通过ip:port来访问服务,就是在svc上映射出一个端口来实现后端pod的访问
- loadbalancer,给予nodeport,借助云供应商,建立一个负载均衡器到ip:nodeport,
- externalName, 集群内部访问集群外部的资源,如果外部集群ip等发生变化,就需要修改内部服务,为了解耦,创建一个svc,用于内部访问外部集群
代理模式
- userspace,client访问service ip,通过service ip的iptables转发到kube proxy,然后通过kube proxy 到server端
- iptables代理模式,client到service ip,通过iptables转发,不再经过kube proxy,apiserver监控kube proxy 对iptables规则进行监控
- ipvs代理,将iptables替换成ipvs,需要提前安装ipvs,并且安装rr、lc、dh、sh、sed、nq等负载均衡算法
- 如果ipvs不可用,会自动转化为iptables
# cluster ip
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
type: ClusterIP
selector:
app: myapp
release: stabel
ports:
- name: http
port: 80
targetPort: 80
- 无头服务,不建立虚拟ip,也不会进行负载均衡和路由,将ClusterIP设置为None即可,可以实现通过域名访问后端的pod
# headless
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
app: myapp
clusterIP: "None"
ports:
- port: 80
targetPort: 80
- svc和pod为多对多关系
# nodePort 每个node上都会绑定一个对外的port,访问任何一个节点都可以
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
type: NodePort
selector:
app: myapp
release: stabel
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30001
- lb和nodeport类似,创建nodeport后,在云端创建lb进行导流,lb一般为收费服务
# externalName
kind: Service
apiVersion: v1
metadata:
name: my-service-1
namespace: default
spec:
type: ExternalName
externalName: www.baidu.com # 外部地址,可以为ip
查询主机 my-service.default.svc.cluster.local的dns记录时,会指向到www.baidu.com,相当于增加了一条cname
ingress
- 需要ingress插件支持,如nginx-ingress,可以下载官方yaml,进行部署
- 会根据ingress的内容,自动生成nginx的配置
- docker save -o xxx.tar.gz xxximages 从docker 导出镜像,docker load -i xx 导入镜像
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-test
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /
backend:
serviceName: nginx-svc
servicePort: 80
- https 转http
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-test
# annotations: # auth basic
# nginx.ingress.kubernetes.io/auth-type: basic
# nginx.ingress.kubernetes.io/auth-secret: basic-auth
# nginx.ingress.kubernetes.io/auth-realm: 'Authentication require - foo'
spec:
tls:
- hosts:
- foo.bar.com
secretName: tls-secret
rules:
- host: foo.bar.com
http:
paths:
- path: /
backend:
serviceName: nginx-svc
servicePort: 80
创建https证书 kubectl create secret tls tls-secret --key tls.key --cert tls.crt
创建auth basic文件
htpasswd -c auth foo
kubectl create secret generic basic-auth --from-file=auth
网友评论