云原生-K8S

k8s是指kubernetes;是一种容器编排系统;其中最核心的组件是docker(就是自动运维管理docker的集群),整个系统都是围绕容器,对其进行管理,扩展,部署;有以下特性:

1
2
3
4
5
容器编排,实现容器的自动部署,调度和协调。
弹性伸缩,根据负载和资源动态调整容器的数量和位置。
服务发现,提供服务注册和发现机制,实现容器间的通信和负载均衡。
部署管理,支持多种部署策略,如滚动更新,回滚等。
开源和易于拓展,支持多种云平台和操作系统,具有丰富的生态系统和社区。

由两部分组成,master和node,架构如下:
alt text

工作原理
alt text

注意点

1
2
3
主节点和从节点,一般分别独立部署在不同服务器上,共同构成了k8s集群,集群可以有多个主从节点;
主节点部署master组件,从节点部署node组件;
K8S 的 Master Node 具备:请求入口管理(API Server),Worker Node 调度(Scheduler),监控和自动调节(Controller Manager),以及存储功能(etcd);而 K8S 的 Worker Node 具备:状态和监控收集(Kubelet),网络和负载均衡(Kube-Proxy)、保障容器化运行环境(Container Runtime)、以及定制化功能(Add-Ons);

K8S 的重要概念有 Deployment、Pod、Replica Set、Service 等

1
2
3
4
5
6
7
pod(仓)是服务的闭包/集合,可以被理解成一群可以共享网络、存储和计算资源的容器化服务的集合;一个里面可以有多个docker服务;
Deployment调度这些副本来替换 的作用是管理和控制 Pod 和 ReplicaSet,管控它们运行在用户期望的状态中。提供更新能力;
ReplicaSet 的作用就是管理和控制 Pod,维护了pod的很多副本,当pod不可用的时候,就Deployment调度这些副本来替换;
用户会直接操作 Deployment 部署服务,而当 Deployment 被部署的时候,K8S 会自动生成要求的 ReplicaSet 和 Pod。
Service 就是微服务,有备份机制的,可以做流量负载均衡
Ingress 用来在集群外部访问集群内部服务;提供负载均衡、SSL 终结和基于名称的虚拟托管;
Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。这些虚拟集群被称为名字空间。

k8s要素关系
alt text
ingress集群内外通信拓扑图
alt text

k8s使用:

常用命令

命令结构:kubectl [command] [TYPE] [NAME] [flags]

1
2
3
4
5
6
7
kubectl:k8s命令行工具;
command:对指定对象要执行的操作;
TYPE:对操作对象/资源类型
NAME:资源/对象的名称,可省略;
- `flags`: 指定可选的参数;如-s/-server,指定服务;
实例:
`kubectl get pods` //查看所有的pods

常用操作

部署服务

  • 如何部署pod
    1
    2
    准备 Pod 的 yaml 配置文件;
    执行 kubectl 命令部署:kubectl create -f ${POD_YAML文件}
  • 如何部署Deployment
    1
    2
    3
    准备 Deployment 的 yaml 配置文件;
    执行 kubectl 命令部署:kubectl create -f ${DEPLOYMENT_YAML文件}
    部署完以上两个对象后,就会自动的创建ReplicaSet 和pod,查看其的命令:get rs、get pod
  • 如何对服务操作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    删除资源:kubectl delete ${RESOURCE} ${NAME} //${RESOURCE}资源类型如pod/rs ${NAME}资源名
    删除pod:kubectl delete pod memory-demo
    删除deployment:kubectl delete deployment ${DEPLOYMENT_NAME} //通过删除deployment来删除服务时,需要先删除deployment,然后还要在删除pod;见上方的调度结构;
    强制删除:kubectl delete pod --force --grace-period=0 ${POD_NAME}

    改:两种方式
    改配置文件,然后重新创建:kubectl create -f ${YAML文件}
    直接改:kubectl edit ${RESOURCE} ${NAME}如kubectl edit pod memory-demo


    查看服务:$ kubectl get|describe ${RESOURCE} [-o ${FORMAT}] -n=${NAMESPACE} //# ${RESOURCE}有: pod、deployment、replicaset(rs)
    查看服务前,必须要知道命名空间,查看命令空间:kubectl get ns;
    查看特定命令空间的deployment:kubectl get deployment -n=oona-test;
    查看特定命令空间的pod:kubectl get pod -n=oona-test;
    查看特定命令空间的rs:kubectl get rs -n=oona-test;
    获取所有命令空间的资源:kubectl get deployment/replicaset/pod --all-namespaces
    命令加[-o wide],显示新学期更全,建议加:kubectl get deployment/replicaset/pod [-o wide] --all-namespaces

    查看资源信息(部署是否成功等):kubectl describe ${RESOURCE} ${NAME}
    查看舱内的服务日志:kubectl log ${POD_NAME} -c ${CONTAINER_NAME}
    进入 Pod 内部某个 container:kubectl exec -it [options] ${POD_NAME} -c ${CONTAINER_NAME} [args] //实际调用了docker容器的docker exec xx进入容器内部
  • docker常用命令:分为镜像管理/容器管理
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    容器运行命令参数

    1. --name 指定容器名称
    2. -d 后台运行
    3. -port 指定端口映射规则
    4. --network 指定容器运行的网路模式
    5. -v 指定需要挂载的数据卷
    6. -env 指定需要传递给容器的环境变量


    下载镜像:docker pull busybox
    导出镜像:docker save busybox > busybox.tar
    导入镜像:docker load < busybox.tar
    push镜像到镜像仓库:docker push


    删除镜像:docker rmi busybox:版本


    改镜像名:docker tag busybox:latest busybox:test
    给镜像加tag:docker tag jenkins:latest jenkins:3.6.0


    查看docker版本:docker version
    查看镜像:docker images

    容器:
    运行容器:docker run(运行) -d(后台方式) --name=busybox busybox:latest ping 114.114.114.114
    查看运行容器:docker ps
    查看所有容器:docker ps -a
    重新启动容器:docker restart busybox
    停止容器:docker stop busybox
    杀死容器:docker kill busybox
    删除运行容器:docker rm -f busybox
    进入容器内:docker exec -it busybox
    复制容器内文件:docker cp busybox:/etc/hosts hosts
    查看容器日志:docker logs -f busybox
  • 服务部署失败了怎么办?
    见k8s入门-简单好理解版本

k8s入门-思路清晰
k8s入门-简单好理解版本

欢迎关注我的其它发布渠道