kubernetes学习
Kubernetes权威指南
1 Kubernetes 入门
1.4 Kubernetes基本概念和术语
1.4.1 Master
Master是集群控制节点,运行着一组关键进程
- Kubernates API Server:提供HTTP Rest接口的关键服务进程
- Kubernates Controller Manager:所有资源的自动化控制中心
- Kubernates Sheduler:负责资源调度的进程
1.4.2 Node
Node节点运行的关键进程:
- kubelet:负责Pod对应的容器的创建、启停等任务
- kube-proxy:实现Kubernates Service的通信与负载均衡机制的重要组件
- Docker-Engine:docker引擎,负责本机的容器创建和管理工作
#查看集群中有多少个Node:
kubectl get nodes
#查看node详细信息
kubectl describe node <node_name>
1.4.3 Pod
- k8s为每个Pod都分配了唯一的Ip地址,称之为PodIP,一个Pod里的多个容器共享PodIP地址。
- 一个Pod里的容器与另外主机上的Pod容器直接通信
Pod相关的概念:
- /Pause 容器
资源定义文件
apiVersion: v1
kind: Pod #表明类型
metadata:
name: myweb # pod名称
labels: #资源标签
name: myweb
spec: # 容器组定义
containers:
- name: myweb #容器名称
image: kubeguide/tomcat-app:v1 #镜像
ports:
- containerPort: 8080 # 容器端口
env:
- name: MYSQL_SERVICE_HOST
value: 'mysql'
- name: MYSQL_SERVICE_PORT
value: '3306'
Event
kubectl describe pod xxx 可以查看到Pod描述信息
资源额度配置
在Kubernetes里,一个计算资源进行配额限定需要设置一下两个参数:
- Requests: 该资源的最小申请量
- Limits: 该资源最大允许使用的量
spec:
containers:
- name: db
image: mysql
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
1.4.4 Label(标签)
用于进行资源管理
Label Selector
基于等式的Label Selector
- name=redis-slave 匹配所有具有标签name=redis-slave 的资源对象
- env!=production 匹配所有不具有标签env=produciton的资源对象
基于集合的Label Selector
- name in (redis-master,redis-slave) 匹配左右name=redis-master 或 name=redis-slave的资源对象
- name not in (php-front):匹配所有不具有标签name=php-front的资源对象
多个条件
多个条件之间使用,表达AND关系
新出现的管理对象如Deployment,ReplicaSet,DaemonSet和Job,可以在Selector中如下表达:
selector:
matchLabels:
app:myweb
matchExpressions:
- {key:tier, operator:In,values:[frontend]}
- {key:environment, operator:NotIn,values:[dev]}
Label Selector 的重要使用场景
- kube-controller 筛选需要监控的Pod副本数量
- kube-proxy 选择对应的Pod,自动建立起Service 到Pod的请求转发路由表
- 通过对某些Node定义特定的Label,可以实现Pod定向调度
1.4.5 Replication Controller
RC定义Pod的理想状况,定义内容包括:
- Pod 期待的副本数
- 用于筛选Pod的Label Secector
- 当Pod副本数量小于预期数量时,用于创建Pod的Pod模板
1.4.6 Deployment
Deployment 的典型使用场景有以下几个:
- 创建一个Deployment对象来生成对应的Replica Set并完成Pod副本的创建过程
- 检查Delployment的状态来看部署对象是否完成(Pod副本的数量是否达到预期的值)
- 更新Deployment以创建新的Pod(比如镜像升级)
- 如果当前Deployment 不稳定则回滚到一个早先的Deployment版本
- 暂停Deployment以便于一次性修改多个PodTemplateSpec的配置项,之后再恢复Deployment,进行新的发布
- 扩展Deployment以应对高负载
- 查看Deployment的状态,以此作为发布是否成功的指标
- 清理不再需要的旧版本Replica Sets
# 创建deployment
kubectl create -f tomcat-deployment.yaml
# 查看deployment 信息
kubectl get deployments
# 查看对应的replica set
kubectl get rs
1.4.7 Horizontal Pod Autoscaler(HPA)
- HPA衡量Pod复杂的度量指标:
- CPUUtilizationPercentage=该Pod使用量/它的Pod Request的值
- 应用程序自定义度量指标,比如服务在每秒内的响应的请求数(TPS 或 QPS)
1.4.8 StatefulSet
- 特性:
- StatefulSet里的每个Pod都有稳定、唯一的网络表示
- StatefulSet控制的Pod副本的启停顺序是受控的
- Stateful里的Pod采用稳定的持久化存储卷,通过PV/PVC来实现,删除Pod时默认不会删除与Stateful相关的存储卷
- StatefulSet需要与Headless Service配合使用,StatefulSet在Headless Service 的基础上又为StatefulSet控制的的每个Pod实例创建一个DNS域名,格式:\({podname}:\)
1.4.9 Service(服务)
1 概述
服务调用问题的转换
为每个服务分配一个全局唯一的虚拟ClusterIP : 服务调用->TCP网络通信问题
# 创建service
kubectl create -f tomcat-server.yaml
# 查看endpoints
kubectl get endpoints
# 查看ClusterIP及更多信息
kubectl get svc tomcat-service -o yaml
Service 的多端口问题
若需要一个Service支持多个端口,配置如下
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
-port: 8080
name:service-port
-port: 8005
name: shutdown-port
selector:
tier: frontend
2 Kubernetes 服务发现机制
- 环境变量
- 服务名->域名
3. 外部系统访问Service的问题
三种ip:
- Node IP : 节点的物理网卡的IP
- Pod IP : dokcer0 虚拟二层网络的IP
- Cluster IP
1.4.10 Volume(存储卷)
1. k8s Volume 和Docker Volume的区别:
- K8s Volume 定义在 Pod上,可以被同个Pod里的多个容器挂载到具体的文件目录下
- K8s Volume 的生命周期与Pod相同,但是与容器不相同
- 最后 K8s 支持多种类型的Volume,包括GlusterFS,Ceph等先进的分布式文件系统
2. K8s提供了丰富的Volume类别
- emptyDir
- 临时空间,例如用于某些应用程序运行时所需的临时目录,且无须永久保留
- 长时间任务的中间过程CheckPoint的临时保存目录
- 一个容器需要从另一个容器中获取数据的目录(多容器共享目录)
2.hostPath - 容器应用程序生成的日志文件需要永久保存时,可以使用宿主机的高速文件系统进行存储
- 需要访问宿主机上Docker引擎内部数据结构的容器应用时,可以通过定义hostPath 为宿主机/var/lib/docker 目录,使容器内部应用可以直接访问Docker的文件系统
注意: - 在不同Node上具有相同配置的Pod可能会因为宿主机上的目录和文件不同而导致对Volume上的目录和文件的访问结果不一致
- 如果是用了资源配额管理,则Kubenetes无法将hostPath在宿主机上使用的资源纳入管理
- getPersisentDisk
使用谷歌公有云提供的永久磁盘
限制条件:
- Node 必须是GCE虚拟机
- 这些虚拟机必须和PD存在于相同的GCE项目和Zone中
4.awsElasticBlockStore
使用亚马逊公有云提供的磁盘
5.NFS
- 其他类型的Volume
- iscsi :使用ISCSI存储设备上的目录挂载到Pod中
- flocker: 使用flocker来管理设备
- glusterfs
- rbc: 使用Ceph块设备共享存储(Rados Block Device)
- gitRepo: 通过挂载一个空目录,并从GIT clone 一个repository 供Pod使用
- secret: 一个 secret volume 用于为Pod提供加密的信息,你可以将定义在Kubernetes中的secret 直接挂载为文件让Pod访问。
1.4.11 Persistent Volume
1. PV 和Volume的区别
- PV 只能是网络存储,不属于任何Node,但是可以在每个Node上访问
- PV 并不是定义在Pod上的,而是独立于Pod之外
- PV 支持类型
2. PV的accessMode 属性
- ReadWriteOnce: 读写权限,并且只能被单个Node挂载
- ReadOnlyMany: 只读权限,并且允许被多个Node挂载
- ReadWriteMany: 读写权限,允许多个Node挂载
3.PV的状态
- Avaliable: 空闲状态
- Bound : 已经绑到某个PVC上
- Released : 对应的PVC已经删除,但是资源还没有被集群收回
- Failed: PV自动回收失败
1.4.12 Namespace
# 查看命名空间
kubernetes get namespaces
1.4.13 Annotation 注解
用户任意定义的附加信息
2 Kubernetes实践指南
2.1 Kubernetes 安装与配置
2.1.1 系统要求
2.1.2 使用kubeadm 工具快速安装kubernetes 集群
- 安装kubeadm和相关工具
# 安装kubenetes 和相关工具
yum install -y kubelet kubeadm kubectl kubernetes-cni
# 启动kubelet 服务
systemctl enable kubelet && systemctl start kubelet
2.手动下载镜像(无法直接访问k8s.gcr.io)
# 1 查看需要下载的镜像
kubeadm config images list
# 返回
k8s.gcr.io/kube-apiserver:v1.24.2
k8s.gcr.io/kube-controller-manager:v1.24.2
k8s.gcr.io/kube-scheduler:v1.24.2
k8s.gcr.io/kube-proxy:v1.24.2
k8s.gcr.io/pause:3.7
k8s.gcr.io/etcd:3.5.3-0
k8s.gcr.io/coredns/coredns:v1.8.6
# 2 寻找对应的镜像替代
# pause
docker pull gotok8s/pause:3.7 && docker tag gotok8s/pause:3.7 k8s.gcr.io/pause:3.7
# etcd
docker pull gotok8s/etcd:3.5.3-0 && docker tag gotok8s/etcd:3.5.3-0 k8s.gcr.io/etcd:3.5.3-0
# kube-apiserver
docker pull gotok8s/kube-apiserver:v1.24.2 && docker tag gotok8s/kube-apiserver:v1.24.2 k8s.gcr.io/kube-apiserver:v1.24.2
# kube-proxy
docker pull gotok8s/kube-proxy:v1.24.2 && docker tag gotok8s/kube-proxy:v1.24.2 k8s.gcr.io/kube-proxy:v1.24.2
# kube-sheduler
docker pull gotok8s/kube-scheduler:v1.24.2 && docker tag gotok8s/kube-scheduler:v1.24.2 k8s.gcr.io/kube-scheduler:v1.24.2
# kube-controller-manager
docker pull gotok8s/kube-controller-manager:v1.24.2 && docker tag gotok8s/kube-controller-manager:v1.24.2 k8s.gcr.io/kube-controller-manager:v1.24.2
# coredns/coredns
docker pull gotok8s/coredns:v1.8.6 && docker tag gotok8s/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6
# 3
1 Master 上的etcd\kube-apiserver\kube-controller-manager\kube-sheduler服务
1) etcd 服务
设置 systemd 服务文件/usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Servcer
After=network.target
[Service]
Type=simple
WorkingDirectory=/var/lib/etcd/ # 表示etcd数据保存目录
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd
[Install]
WantedBy=multi-user.target
2) kube-apiserver 服务
3) kube-controller-manager服务
2.1.8 Kubernetes 核心服务配置详解
2.2 kubectl 命令行工具用法详解
2.2.1 kubectl 用法概述
# kubectl 命令语法如下:
kubectl [command] [TYPE] [NAME] [flags]
(1) command: 子命令
(2) TYPE: 资源类型
(3) NAME: 资源名称
(4) flags: 子命令可用参数
资源对象名 | 缩写 |
---|---|
clusters | cs |
componentstatuses | cm |
daemonsets | ds |
deployments | deploy |
endpoints | ep |
events | ev |
horizontalpodautoscalers | hpa |
ingresses | ing |
nodes | no |
namespaces | ns |
networkpolicies | |
statefulsets | |
persistentvolumeclaims | pvc |
persistentvolume | pv |
pods | po |
podsecuritypolicies | psp |
podtemplates | |
replicasets | rs |
replicationcontrollers | rc |
resourcequotas | quota |
cronjob | |
secrets | |
serviceaccounts | |
services | svc |
storageclasses | sc |
thirdpartysources |
2.2.2 kubectl 子命令详解
子命令 | 语法 | 说明 |
---|---|---|
annotation | kubectl annotate (-f FILENAME | TYPE NAME |
api-versions | kubectl api-versions [flags] | 列出当前系统支持的API版本列表,格式为"group/version" |
apply | kubectl apply -f FILENAME [flags] | 从配置文件或stdin对资源对象进行更新 |
attach | kubectl attach POD -c CONTAINER [flags] | 附着到一个正在运行的容器上 |
autoscale | kubectl autoscale (-f FILENAME | TYPE NAME |
cluster-info | kubectl cluster-info [flags] | 显示集群Master和内置服务的信息 |
completion | kubectl completion SHELL [flags] | 输出shell命令的执行结果码(bash 或zsh) |
2.2.3 kubectl 参数列表
2.2.4 kubectl 输出格式
2.2.5 kubectl 操作示例
2.3 深入掌握Pod
2.4 深入掌握Service
3 Kubernetes核心原理
4 Kubernetes开发指南
5 Kubernetes运维指南
6 Kubernetes源码导读
I'm a fucKing fake coder!