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)

  1. HPA衡量Pod复杂的度量指标:
  • CPUUtilizationPercentage=该Pod使用量/它的Pod Request的值
  • 应用程序自定义度量指标,比如服务在每秒内的响应的请求数(TPS 或 QPS)

1.4.8 StatefulSet

  1. 特性:
  • StatefulSet里的每个Pod都有稳定、唯一的网络表示
  • StatefulSet控制的Pod副本的启停顺序是受控的
  • Stateful里的Pod采用稳定的持久化存储卷,通过PV/PVC来实现,删除Pod时默认不会删除与Stateful相关的存储卷
  1. 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 服务发现机制

  1. 环境变量
  2. 服务名->域名

3. 外部系统访问Service的问题

三种ip:

  • Node IP : 节点的物理网卡的IP
  • Pod IP : dokcer0 虚拟二层网络的IP
  • Cluster IP

1.4.10 Volume(存储卷)

1. k8s Volume 和Docker Volume的区别:

  1. K8s Volume 定义在 Pod上,可以被同个Pod里的多个容器挂载到具体的文件目录下
  2. K8s Volume 的生命周期与Pod相同,但是与容器不相同
  3. 最后 K8s 支持多种类型的Volume,包括GlusterFS,Ceph等先进的分布式文件系统

2. K8s提供了丰富的Volume类别

  1. emptyDir
  • 临时空间,例如用于某些应用程序运行时所需的临时目录,且无须永久保留
  • 长时间任务的中间过程CheckPoint的临时保存目录
  • 一个容器需要从另一个容器中获取数据的目录(多容器共享目录)
    2.hostPath
  • 容器应用程序生成的日志文件需要永久保存时,可以使用宿主机的高速文件系统进行存储
  • 需要访问宿主机上Docker引擎内部数据结构的容器应用时,可以通过定义hostPath 为宿主机/var/lib/docker 目录,使容器内部应用可以直接访问Docker的文件系统
    注意:
  • 在不同Node上具有相同配置的Pod可能会因为宿主机上的目录和文件不同而导致对Volume上的目录和文件的访问结果不一致
  • 如果是用了资源配额管理,则Kubenetes无法将hostPath在宿主机上使用的资源纳入管理
  1. getPersisentDisk
    使用谷歌公有云提供的永久磁盘
    限制条件:
  • Node 必须是GCE虚拟机
  • 这些虚拟机必须和PD存在于相同的GCE项目和Zone中
    4.awsElasticBlockStore
    使用亚马逊公有云提供的磁盘
    5.NFS
  1. 其他类型的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 集群

  1. 安装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源码导读

posted @ 2022-04-10 16:42  Fake_coder  阅读(64)  评论(0编辑  收藏  举报