Kubernetes学习笔记
简介
Kubernetes 是 Google 团队发起并维护的开源容器集群管理系统。基于容器技术实现资源的自动化管理。
kubernetes不仅支持Docker还差支持Rocket等其他容器运行时。
kubernetes的核心概念是pod。一个pod由一组工作于同一个物理工作节点的容器构成。这些组容器拥有相同的网络命名空间、IP以及存储配额。此外,kubernetes的Node工作节点会由Master节点进行管理,每个节点都包含了能够运行Docker容器所用到的服务。
相关服务组件
主节点Master服务
- apiserver 是整个系统的对外接口,提供 RESTful 方式供客户端和其它组件调用;
- scheduler 负责对资源进行调度,分配某个 pod 到某个节点上;
- controller-manager 负责管理控制器,包括 endpoint-controller(刷新服务和 pod 的关联信息)和 replication-controller(维护某个 pod 的复制为配置的数值)。
工作节点Node服务
- kubelet 是工作节点执行操作的 agent,负责具体的容器生命周期管理,根据从数据库中获取的信息来管理容器,并上报 pod 运行状态等;
- kube-proxy 为 pod 上的服务提供访问的代理。
其他服务
- Etcd 是所有状态的存储数据库,是一个分布式键值对存储系统。
基本概念
- 节点( Node ):一个节点是一个运行 Kubernetes 中的主机。
- 容器组( Pod ):一个 Pod 对应于由若干容器组成的一个容器组,同个组内的容器共享一个存储卷(volume)。
- 容器组生命周期( pos-states ):包含所有容器状态集合,包括容器组状态类型,容器组生命周期,事件,重启策略,以及 replication controllers。
- Replication Controllers:主要负责指定数量的 pod 在同一时间一起运行。
- 服务( services ):一个 Kubernetes 服务是容器组逻辑的高级抽象,同时也对外提供访问容器组的策略。
- 卷( volumes ):一个卷就是一个目录,容器对其有访问权限。
- 标签( labels ):标签是用来连接一组对象的,比如容器组。标签可以被用来组织和选择子对象。
- 接口权限( accessing_the_api ):端口,IP 地址和代理的防火墙规则。
- web 界面( ui ):用户可以通过 web 界面操作 Kubernetes。
- 命令行操作( cli ): kubecfg 命令。
kubectl常见命令使用
- get: 显示一个或多个资源
- describe: 显示资源详情
- create: 从文件或标准输入创建资源
- update: 从文件或标准输入更新资源
- delete: 通过文件名、标准输入、资源名或者label selector删除- 资源
- log: 输出pod中一个容器的日志
- rolling-update: 对指定的replication controller执行滚动升- 级
- exec: 在容器内部执行命令
- port-forward: 将本地端口转发到Pod
- proxy: 为Kubernetes API server启动代理服务器
- run: 在集群中使用指定镜像启动容器
- expose: 将 replication controller service 或 pod 暴露为新- 的 kubernetes service
- label: 更新资源的label
- config: 修改 kubernetes 配置文件
- cluster-info: 显示集群信息
- api-versions: 以 "组/版本" 的格式输出服务端支持的 API 版本
- version: 输出服务端和客户端的版本信息
- help: 显示各个命令的帮助信息
- replace: 对已有资源进行更新、替换
- patch: 在容器运行时,直接对容器进行修改
- scale: 用于程序在负载加重或缩小时副本进行扩容或缩小
相关yaml格式
- pod(deployment方式)
apiVersion: apps/v1 #指定api版本,此值必须在kubectl apiversion中
kind: Deployment #指定创建资源的角色/类型
metadata: #资源的元数据/属性
name: nginx-pod #资源的名字,在同一个namespace中必须唯一
labels: #设定资源的标签,详情请见http://blog.csdn.net/liyingke112/article/details/77482384
k8s-app: apache
version: v1
kubernetes.io/cluster-service: "true"
annotations: #自定义注解列表
- name: String #自定义注解名字
spec: #specification of the resource content 指定该资源的内容
selector:
matchLabels:
app: nginx-pod
replicas: 1 #运行一个实例
restartPolicy: Always #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器
nodeSelector: #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1
zone: node1
template:
metadata:
labels:
app: node-server
enabled: "true"
spec:
containers:
- name: nginx-pod #容器的名字
image: nginx:latest #容器使用的镜像地址
imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略,
#Always,每次都检查
#Never,每次都不检查(不管本地是否有)
#IfNotPresent,如果本地有就不检查,如果没有就拉取
command: ['sh'] #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT
args: ["$(str)"] #启动容器的命令参数,对应Dockerfile中CMD参数
env: #指定容器中的环境变量
- name: str #变量的名字
value: "/etc/run.sh" #变量的值
resources: #资源管理,请求请见http://blog.csdn.net/liyingke112/article/details/77452630
requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m)
memory: 32Mi #内存使用量
limits: #资源限制
cpu: 0.5
memory: 32Mi
ports:
- containerPort: 80 #容器开发对外的端口
name: httpd #名称
protocol: TCP
livenessProbe: #pod内容器健康检查的设置,详情请见http://blog.csdn.net/liyingke112/article/details/77531584
httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常
path: / #URI地址
port: 80
#host: 127.0.0.1 #主机地址
scheme: HTTP
initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始
timeoutSeconds: 5 #检测的超时时间
periodSeconds: 15 #检查间隔时间
#也可以用这种方法
#exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常
# command:
# - cat
# - /tmp/health
#也可以用这种方法
#tcpSocket: //通过tcpSocket检查健康
# port: number
lifecycle: #生命周期管理
postStart: #容器运行之前运行的任务
exec:
command:
- 'sh'
- 'yum upgrade -y'
preStop: #容器关闭之前运行的任务
exec:
command: ['service httpd stop']
volumeMounts: #详情请见http://blog.csdn.net/liyingke112/article/details/76577520
- name: volume #挂载设备的名字,与volumes[*].name 需要对应
mountPath: /data #挂载到容器的某个路径下
readOnly: True
volumes: #定义一组挂载设备
- name: volume #定义一个挂载设备的名字
#meptyDir: {}
hostPath:
path: /opt #挂载设备类型为hostPath,路径为宿主机下的/opt,这里设备类型支持很多种
- service
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort #有配置NodePort,外部流量可访问k8s中的服务
ports:
- port: 30080 #服务访问端口
targetPort: 80 #容器端口
nodePort: 30001 #NodePort集群外访问端口
selector:
name: nginx-pod
- deployment(简洁版)
apiVersion: extensions/v1beta1 #当前格式的版本
kind: Deployment #当前创建资源的类型, 当前类型是Deployment
metadata: #当前资源的元数据
name: nginx-test #当前资源的名字 是元数据必须的项
spec: #是当前Deployment的规格说明
replicas: #指当前创建的副本数量 默认不填 默认值就为‘1’
template: #定义pod的模板
metadata: #当前pod的元数据
labels: #至少顶一个labels标签,可任意创建一个 key:value
app: web_server
spec: #当前pod的规格说明
containers: #容器
- name: nginx #是容器的名字容器名字是必须填写的
image: nginx:latest #镜像 镜像的名字和版本
- deamonset
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: k8s.gcr.io/fluentd-elasticsearch:1.20
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers

浙公网安备 33010602011771号