Resource 是 Kubernetes 的一个基础概念,kubernets 用 Resource 来表示集群中的各个资源。比如 Pod 节点(主机)、Container 容器、Proxy 路由、Config 配置文件等等。这些概念听起来差别很大,但是却有很多共同的基本属性。比如名称、创建时间、标签、uuid 等。kubernetes 对这些信息进行抽象,提供了一个通用的 metadata 结构,再加上各个 resource 自己的其它信息,构成了一个形式类似的数据结构。
namespace 的作用是用于名称隔离。kubernetes的场景是面向多用户的,需要有一个类似于工作空间的东西用来隔离。
集群创建之后,会默认创建三个namespace:
ConfigMap是属于namespace的资源,像环境变量或者很多软件的配置文件,存储了一些key-value。
Secret对象可以存储和管理敏感信息
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
apiVersion: v1
kind: Secret
metadata:
name: mysecret-2
type: Opaque
stringData:
config.yaml: |-
apiUrl: "https://my.api.com/api/v1"
username: admin
password: 1f2d1e2e67df
StringData字段下的所有条目会被Base64编码之后展示在data字段下
[TO DO]
认证主要供集群内部Pod中的进程使用,以便Pod可以从内部使用API Server
默认会创建default的ServiceAccount关联着一个名为default-token-v6wkr
的Secret,里面存放着ServiceAccount的认证信息,这些认证信息可以访问API Server
访问API-SERVER需要经过
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: '/etc/foo'
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
k8s的存储组件,k8s中的数据主要都存在于其中
k8s对外提供API服务的组件,也主要负责与etcd交互
负责调度pod的组件。当我们想在一堆机器中运行pod时,负责决定将pod运行在哪个机器上
requests: pod运行所需要的最少资源,例如K8s在调度pod时,就是以这个设置来挑选node
limits:pod运行的上限,超过这个limits,pod会被kill掉
如果要在容器创建后或停止前执行某些操作,则可以注册以下两个事件的回调
设置探针
Deployment控制器旨在简化Pod的生命周期管理。只需要简单更改Deployment控制器的配置文件,K8s就会自动调节Replicas控制器,管理应用程序不同版本之间的切换
kubectl set image deployment/ngxin-deployment nginx=nginx:1.9.1
# 也可以使用kubectl edit命令进行更新,把image字段修改版本
kubectl edit deployment/nginx-deployment
目前无论是直接更新还是滚动更新,都会一直持续更新
可以尝试一个最新的Pod,待这个Pod验证无误后,再更新剩余的Pod
kubectl set image deploy exampledeployment nginx=nginx:1.9.1 --record
# --record 必须携带上,这样才会记录Deployment所使用的命令
kubectl rollout pause deploy exampledeployment # 暂停更新
kubectl rollout resume deploy exampledeployment # 恢复更新
kubectl rollout history deployment exampledeployment # 查看历史变更记录
kubectl rollout undo deployment exampledeployment --to-revision=2 # 回滚上个版本
DaemonSet是一种特殊的控制器,会在集群中的各个节点上运行单一的Pod,它非常适合部署那些为节点本身提供服务或执行维护的Pod
spec:
completions: 5 # 执行5次
spec:
completions: 11
parallelism: 5
spec:
backoffLimit: 6
template:
spec:
restartPolicy: OnFailure
spec:
backoffLimit: 6
template:
spec:
restartPolicy: Never
执行任务达到上限时间会自动删除Pod
spec:
activeDeadlineSeconds: 10
ClusterIP
:这是一种虚拟IP,没有实际的网络设备承载这个地址,它的底层实现原理是依靠kube-proxy通过iptables规则重定向到Node节点的端口上,再负载均衡到后端PodNodeIP
:当集群需要提供外部服务,这时候就需要为服务提供公共IP,集群外部通过nodeIP:nodePort就可以访问服务PodIP
:当每个新 Pod 创建时,集群都会先使用 gcr.io/google_containers/pause
镜像创建一个容器,然后再创建其它要求的容器。在 Pod 内部其它容器都使用container
网络模式,并指定其值为 pause 容器的 ID(即:"network_mode: "container: pause 容器 ID"
),这样 Pod 内所有容器将共享 pause 容器的网络,所有其他容器在 Pod 内部都处于同一个网络模式下,可以彼此间直接通信,而与外部通信都会经过 pause 容器进行代理,因此 pause 容器 IP 才是真正实际意义上的 PodIP。ExternalIP
:外部 IP,通过负载均衡(LB)方式发布服务的话,也就是 LoadBalancer Service 类型,公有云提供的负载均衡器的访问地址。通过Service和ExternalIP等等,这些方式都是通过节点端口向外暴露服务的,一旦Service变多,每个节点上开启的端口也会变多,维护起来相当复杂。
Ingress 可以避免这个问题,除了Ingress自身的服务需要向外发布之外,其他服务不必使用节点端口形式向外发布。
curl https://www.lanqiao.cn/courses
# 请求会被路由到后端名为courses的Service
emptyDir是指一个纯净的空目录,这个目录映射到主机的一个临时目录下,如果Pod销毁,那么存储卷也会同时销毁,emptyDir主要用于存放和共享Pod的不同容器之间在运行过程中产生的文件
hostPath主要用于把主机上指定的目录映射到Pod中容器上,如果Pod需要在主机上存储和共享文件,或使用主机上的文件,就可以使用这种方式。
存放在主机上的文件不会被销毁,会永远保存,Pod销毁后,若又在这台机器上重建,则可以读取原来的内容,但如果机器出现故障或者Pod被调度到其他机器上,就无法读取原来的内容了。
是一种提供排序和唯一性保证的特殊Pod控制器。当有与部署顺序、持久数据或固定网络等相关的特殊需求时,可用StatefulSet控制器来进行更细粒度的控制(对应于有状态服务)
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问。
为什么Docker比Vm快?
是Docker容器运行的只读模板,每一个镜像由一系列的层layer组成。通过镜像可以创建多个容器
是基于镜像启动起来的,容器中可以运行一个或多个进程。容器之间是相互隔离的
镜像是docker生命周期中的构建和打包阶段,而容器则是启动或执行阶段
Docker容器中进程pid=1的进程退出后,容器就结束了,docker容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为空闲,就会自行退出。
docker info
docker version
docker images # 查看所有本地主机上的镜像
docker images -aq # 列出所有镜像的id
docker search # 搜索镜像
docker pull # 下载镜像
docker pull tomcat[:tag] # 下载指定版本的镜像
docker rmi -f 镜像id
docker rmi -f ${docker ps -aq} # 删除所有的镜像
# 容器命令
docker run 镜像id # 新建容器并且启动
docker ps # 列出所有运行的容器 docker container list
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器
docker rm -f ${docker ps -aq} # 删除所有的容器
docker ps -a -q|xargs docker rm # 删除所有的容器
# 新建容器并且启动
docker run [] image
--name="Name" # 容器的名字 tomcat01, tomcat02 用来区别容器
-d # 后台的方式运行
-it # 使用交互方式进行,进入容器中查看内容
-p # 指定容器的端口
-P # 随机指定端口
docker run -it centos /bin/bash
# 退出容器
ctrl + P + Q # 容器不停止退出
exit # 容器直接退出
# 查看日志
docker logs [-tf --tail number] 容器id
[-t] # 显示时间戳
[-f] # 追踪日志
[--tail number] # 显示最后几条日志条数
docker logs -t --tail n 容器id # 查看n行日志
docker logs -tf 容器id # 跟着日志
# 查看容器中进程的信息ps
docker top 容器id
# 查看容器中的元数据
docker inspect 容器id
# 进入当前正在运行的容器
# 通常容器都是使用后台进行运行的,需要进入容器,修改一些配置
1. docker exec -it 容器id /bin/bash # 进入容器后开启一个新的终端,可以在里面操作
2. docker attach 容器id # 进入容器正在执行的终端
# 从容器内拷贝到主机上
docker cp 容器id:容器内路径 主机目的路径
# 区别三种挂载方式
-v 容器内路径 # 匿名挂载
-v 卷名: 容器内路径 # 具名挂载
-v /宿主机路径: 容器内路径 # 指定路径挂载 docker volume ls 查看不到
# ro rw 改变读写权限
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 说明这个路径只能通过宿主机来操作,容器内部是无法操作
两个或者多个容器之间实现数据共享
docker run -it -name docker01 huyuanyuan/centos
docker run -it --name docker02 --volumes-from docker01 huyuanyuan/centos
docker run -it --name docker03 --volumes-from docker01 huyuanyuan/centos
# 删除docker01, 查看docker02 docker03 可以访问这个文件
# 容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
# 如果持久化到了本地,本地的数据是不会被删除的