在k8s中的基本概念php
一.Pod
1. pod
k8s下最重要也最基本的概念,由一个根容器Pause和许多用户业务容器组成,是容器的载体.html
2. pod的yaml定义格式及字段node
apiVersion: v1 //版本 kind: pod //类型,pod metadata: //元数据 name: String //元数据,pod的名字 namespace: String //元数据,pod的命名空间 labels: //元数据,标签列表 - name: String //元数据,标签的名字 annotations: //元数据,自定义注解列表 - name: String //元数据,自定义注解名字 spec: //pod中容器的详细定义 containers: //pod中的容器列表,能够有多个容器 - name: String image: String //容器中的镜像 imagesPullPolicy: [Always|Never|IfNotPresent]//获取镜像的策略 command: [String] //容器的启动命令列表(不配置的话使用镜像内部的命令) args: [String] //启动参数列表 workingDir: String //容器的工做目录 volumeMounts: //挂载到到容器内部的存储卷设置 - name: String mountPath: String readOnly: boolean ports: //容器须要暴露的端口号列表 - name: String containerPort: int //容器要暴露的端口 hostPort: int //容器所在主机监听的端口(容器暴露端口映射到宿主机的端口) protocol: String env: //容器运行前要设置的环境列表 - name: String value: String resources: //资源限制 limits: cpu: Srting memory: String requeste: cpu: String memory: String livenessProbe: //pod内容器健康检查的设置 exec: command: [String] httpGet: //经过httpget检查健康 path: String port: number host: String scheme: Srtring httpHeaders: - name: Stirng value: String tcpSocket: //经过tcpSocket检查健康 port: number initialDelaySeconds: 0//首次检查时间 timeoutSeconds: 0 //检查超时时间 periodSeconds: 0 //检查间隔时间 successThreshold: 0 failureThreshold: 0 securityContext: //安全配置 privileged: falae restartPolicy: [Always|Never|OnFailure]//重启策略 nodeSelector: object //节点选择 imagePullSecrets: - name: String hostNetwork: false //是否使用主机网络模式,默认否 volumes: //在该pod上定义共享存储卷 - name: String meptyDir: {} hostPath: path: string secret: //类型为secret的存储卷 secretName: String item: - key: String path: String configMap: //类型为configMap的存储卷 name: String items: - key: String path: String
3. label 和 label selector
label是k8s中的核心概念,label由key和value组成,用户自定义,用以区分和筛选pod.
如:Service和ReplicationController中筛选component为redis的pod
selector:
component: redisnginx
二.ReplicationController
1.ReplicationController(简称Rc)
Rc控制了定期望的数量来运行pod.Rc定义包括了如下部分:
a.期待的pod副本数
b.筛选目标pod的label selector
c.但pod小于指定副本数的时候,用于建立pod的模板(template).web
2.定义示例:redis
apiVersion: v1 kind: ReplicationController metadata: name: nginx spec: replicas: 3 selector: app: nginx template: metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
3.删除Rc并不会删除rc建立的pod.为了删除全部pod,能够将replicas设置为0.
如:
kubectl scale rc php-rc --replicas 0docker
4.扩容
kubectl scale rc php-rc --replicas 2后端
5.自动控制pod副本数量最小1,最大4:
kubectl autoscale rc php-rc --min=1 --max=4 api
三.Deployment
在内部使用了Replica Set(能够看作是Rc的升级版本,90%与Rc类似).安全
三.Service
1.概念及做用:
定义了一个服务访问的入口地址,由于pod副本会有多个,一样的地址也就有多个,若是没有service,将须要考虑pod的负载均衡问题.换句话说service将一组pod组成一个集合来提供给其余资源,用户无需关注各个pod副本.
Service与先后端的Pod集群经过label selector来实现对接,rc保证了service(其实是pod的数量)服务质量
2.IP种类
Node IP: 节点IP(物理网卡)
Pod IP: pod上的IP(Docker Engine分配)
Cluster IP: service上的IP(K8s分配,没法被ping)
3.ports属性:
nodePort: 外部访问service,经过nodeIP:nodePort方式提供给外部访问k8s中的服务(须要配置对应service的type为NodePort,同时在节点服务器上设置转发iptables -P FORWARD ACCEPT,默认为30000-32767)
port: k8s内部访问service的端口
targetPort: 容器的端口,是pod上的端口(如无指定,默认和port相同)
流量进入路径为:nodePort -> port -> targetPort
4.服务发现:
环境变量(可进入具体的pod中查看每一个service对应的环境变量)和kube-dns
5.Service的type类型:
ClusterIP: 仅仅使用一个集群内部的IP地址 - 这是默认值。选择这个值意味着你只想这个服务在集群内部才能够被访问到
请注意,这个内部访问指的是在集群内部的pod上能够访问service,
并非集群内部节点上直接访问;在service所在pod的节点主机上是能够直接以ClusterIP:端口的形式访问到;若是pod不在该节点上,节点主机要访问该service,须要作IP转发:
ip route add 10.254.0.0/16 dev docker0
10.254.0.0是service网段
你能够在节点服务器上运行:
iptables -S -t nat | grep KUBE-SERVICES
来查看转发规则
NodePort: 在集群内部IP的基础上,在集群的每个节点的端口上开放这个服务。你能够在外部经过<NodeIP>:NodePort地址上访问到这个服务(其中NodeIP是任意节点的ip地址)
LoadBalancer: 在使用一个集群内部IP地址和在NodePort上开放一个服务以外,向云提供商申请一个负载均衡器,会让流量转发到这个在每一个节点上以<NodeIP>:NodePort的形式开放的服务上。
四.存储卷(Volume)
1.示例:
spec: containers: - name: nginx image: nginx:alpine volumeMounts: - name: web-root mountPath: /usr/share/nginx/html volumes: - name: web-root nfs: server: 192.168.2.17 path: /data/nfs
2.volume取值
emptyDir: 是在pod分配到node上建立的,初始内容为空;无需指定名称,k8s会自动分配目录.pod移除时,该目录也被删除.
hostPath: 在pod上挂载宿主机上的目录.
nfs: 使用nfs网络文件系统提供的共享目录
五.命名空间
1.k8s默认使用的命名空间是default,使用kubectl get namespaces查看
2.定义命名空间:
apiVersion: v1 kind: namespace metadata: name: projectA
3.使用命名空间:
apiVersion: v1 kind: Pod metadata: name: nginx-pod namespace: projectA labels: name: nginx-pod spec: containers: - name: nginx ....
4.namespace能够实现多用户资源隔离
查看全部命名空间下的pods
#kubectl get pods --all-namespaces
六.kubectl命令行工具用法
1.语法:
kubectl [command] [TYPE] [NAME] [flags]
(1)command:子命令,用于操做k8s集群资源对象的命令.如create, delete, describe, get, apply
(2)TYPE:资源对象的类型,区分大小写,能以单数形式,复数形式或者简写形式表示.如pod,service,node等
(3)NAME:资源对象的名称,区分大小写,若是不指定,则返回所有.
(4)flags:子命令可选参数,如-s指定apiserver的url地址而不使用默认值
2.输出格式:
输出格式经过-o参数指定
3.操做示例
(1).建立资源对象
根据yaml配置文件建立
kubectl create -f my-service.yaml my-pod.yaml
(2)查看资源对象
kubectl get pod,rc,service
(3)描述资源对象
kubectl describe pods
显示由rc管理的pod信息
kubectl describe pods <rc-name>
(4)删除资源对象
kubectl delete -f my-service.yaml
经过label删除
kubectl delete pods -l name=<label-name>
删除全部
kubectl delte pods --all
(5)执行容器命令
默认使用pod中的第一个容器:
kubectl exec <pod-name> date
指定pod中的容器执行命令:
kubectl exec <pod-name> -c <conatiner-name> date
经过bash得到pod中某个容器的tty,至关于登陆容器:
kubectl exec -ti <pod-name> -c <conatiner-name> /bin/bash
6.查看容器日志:查看容器输出到stdout的日志kubectl logs <pod-name>跟踪查看容器的日志,至关于tail -f:kubectl logs -f <pod-name> -c <conatiner-name>