分享

最新、最全、最详细的 K8S 学习笔记总结(2021最新版)(二)


上一篇:最新、最全、最详细的 K8S 学习笔记总结(2021最新版)(一)

问题导读:

1、什么是Harbor 仓库?
2、什么是YAML?
3、什么是kubectl?



Harbor 仓库

Kuternetes 企业级 Docker 私有仓库 Harbor 工具。

Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 Docker Compose 来对它进行部署。用于部署 Harbor 的 Docker Compose 模板位于 /Deployer/docker-compose.yml 中,其由 5 个容器组成,这几个容器通过 Docker link 的形式连接在一起,在容器之间通过容器名字互相访问。对终端用户而言,只需要暴露 Proxy(即Nginx) 的服务端口即可。

Proxy

由Nginx服务器构成的反向代理

Registry

由Docker官方的开源官方的开源Registry镜像构成的容器实例

UI

即架构中的core services服务,构成此容器的代码是Harbor项目的主体

MySQL

由官方MySQL镜像构成的数据库容器

Log

运行着rsyslogd的容器,通过log-driver的形式收集其他容器的日志

详细介绍与搭建步骤请参考:企业级环境中基于 Harbor 搭建

YAML 语法

YAML 是一种非常简洁/强大/专门用来写配置文件的语言!

YAML 全称是 ”YAML Ain’t a Markup Language” 的递归缩写,该语言的设计参考了 JSON / XML 和 SDL 等语言,强调以数据为中心,简洁易读,编写简单。

25267841-293160b79567bb25.png

YAML 语法特性

学过编程的人理解起来应该非常容易
25267841-de2e9df4b2953752.png

语法特点

  • 大小写敏感

  • 通过缩进表示层级关系

  • 禁止使用tab缩进,只能使用空格键

  • 缩进的空格数目不重要,只要相同层级左对齐

  • 使用#表示注释

推荐给大家一篇文章:Kubernetes 之 YAML 语法,这篇文章介绍的非常详细,有很多例子说明。

资源清单

K8S 中所有的内容都抽象为了资源,资源实例化之后就叫做对象。

在 Kubernetes 系统中,Kubernetes对象是持久化的实体,Kubernetes使用这些实体去表示整个集群的状态。特别地,它们描述了如下信息:

哪些容器化应用在运行,以及在哪个 Node 上

可以被应用使用的资源

关于应用运行时表现的策略,比如重启策略、升级策略,以及容错策略

Kubernetes 对象是 “目标性记录” —— 一旦创建对象,Kubernetes 系统将持续工作以确保对象存在。通过创建对象,本质上是在告知 Kubernetes 系统,所需要的集群工作负载看起来是什么样子的,这就是 Kubernetes 集群的期望状态。

25267841-d53f496aecb41a7d.png

Kubernetes 之资源清单详细介绍看这里

资源控制器

Kubernetes 资源控制器配置文件的编写是学习 K8S 的重中之重!

资源配额控制器确保了指定的资源对象始终不会超过配置的资源,能够有效的降低整个系统宕机的机率,增强系统的可用性,对整个集群的稳定性有非常重要的作用。

25267841-919e7ee92bc20d9e.png

Kubernetes 资源控制器使用指南手册

服务发现

Kubernetes 中为了实现服务实例间的负载均衡和不同服务间的服务发现,创造了 Service 对象,同时又为从集群外部访问集群创建了 Ingress 对象。

25267841-76346bf9d344f393.png

Kubernetes 之服务发现

Ingress 服务

我们都知道传统的 SVC 只支持四层上面的代码,而对于七层上的代码而无能为力。比如:我们使用 K8S 集群对外提供 HTTPS 的服务,为了方便和便捷,我们需要在对外的 Nginx 服务上面配置 SSL 加密,但是将请求发送给后端服务的时候,进行证书卸载的操作,后续都是用 HTTP 的协议进行处理。而面对此问题,K8S 中给出了使用 Ingress (K8S在1.11版本中推出了)来进行处理。

25267841-7e4b32935620e6b6.png

更多详细内容请参阅:Kubernetes 之 Ingress 服务,介绍关于 Ingress 服务的安装方式,配置关于 Ingress 服务的 HTTP 代理访问,介绍 Ingress 服务的 BasicAuth 认证方式,介绍 Ingress 的进行规则重写的方式。

数据存储

在之前的文章中,我们已经知道了很多 K8S 中的组件了,包括资源控制器等。在资源控制器中,我们说到了 StatefulSet 这个控制器组件,其专门为了有状态服务而生的,而对应的存储要存放到哪里呢?

25267841-e0c91a1227f9909e.png

介绍 K8S 中常见的存储机制可以让我们所使用的:Kubernetes 之数据存储

集群调度

有这样一个需求,就是集群中多台服务的配置是不一致的。这就导致资源分配并不是均匀的,比如我们需要有些服务节点用来运行计算密集型的服务,而有些服务节点来运行需要大量内存的服务。而在 k8s 中当然也配置了相关服务来处理上述的问题,那就是 Scheduler。

Scheduler 是 kubernetes 的调度器,主要的任务是把定义的 Pod 分配到集群的节点上。听起来非常简单,但有很多要考虑的问题:

公平

如何保证每个节点都能被分配资源

资源高效利用

集群所有资源最大化被使用

效率

调度的性能要好,能够尽快地对大批量的 Pod 完成调度工作

灵活

允许用户根据自己的需求控制调度的逻辑

Scheduler 是作为单独的程序运行的,启动之后会一直坚挺 API Server,获取 PodSpec.NodeName 为空的 Pod,对每个 Pod 都会创建一个 binding,表明该 Pod 应该放到哪个节点上。

25267841-26e940fad2277b9f.png

详细的介绍请参考:Kubernetes 之集群调度

kubectl 使用指南

kubectl 是 Kubernetes 自带的客户端,可以用它来直接操作 Kubernetes 集群。

日常在使用 Kubernetes 的过程中,kubectl 工具可能是最常用的工具了,所以当我们花费大量的时间去研究和学习 Kuernetes 的时候,那么我们就非常有必要去了解下如何高效的使用它了。

从用户角度来说,kubectl 就是控制 Kubernetes 的驾驶舱,它允许你执行所有可能的 Kubernetes 操作;从技术角度来看,kubectl 就是 Kubernetes API 的一个客户端而已。

25267841-28545c4d863670cf.png

Kubernetes API 是一个 HTTP REST API 服务,该 API 服务才是 Kubernetes 的真正用到的用户接口,所以 Kubernetes 通过该 API 进行实际的控制。这也就意味着每个 Kubernetes 的操作都会通过 API 端点暴露出去,当然也就可以通过对这些 API 端口进行 HTTP 请求来执行相应的操作。所以,kubectl 最主要的工作就是执行 Kubernetes API 的 HTTP 请求。

工具使用参数

get                   #显示一个或多个资源

describe          #显示资源详情

create              #从文件或标准输入创建资源

update             #从文件或标准输入更新资源

delete              #通过文件名、标准输入、资源名或者 label 删除资源

log                   #输出 pod 中一个容器的日志

rolling-update  #对指定的 RC 执行滚动升级

exec                #在容器内部执行命令

port-forward    #将本地端口转发到

Podproxy        #为 Kubernetes API server 启动代理服务器

run                  #在集群中使用指定镜像启动容器

expose            #将 SVC 或 pod 暴露为新的 kubernetes service

label               #更新资源的 label

config             #修改 kubernetes 配置文件

cluster-info     #显示集群信息

api-versions   #以”组/版本”的格式输出服务端支持的 API 版本

version           #输出服务端和客户端的版本信息

help               #显示各个命令的帮助信息

ingress-nginx#管理 ingress 服务的插件(官方安装和使用方式)

使用相关配置

# Kubectl自动补全

$ source <(kubectl completion zsh)

$ source <(kubectl completion bash)

# 显示合并后的 kubeconfig 配置

$ kubectl config view

# 获取pod和svc的文档

$ kubectl explain pods,svc

创建资源对象

分步骤创建

# yaml

kubectl create -f xxx-rc.yaml

kubectl create -f xxx-service.yaml

# json

kubectl create -f ./pod.json

cat pod.json | kubectl create -f -

# yaml2json

kubectl create -f docker-registry.yaml --edit -o json

一次性创建

kubectl create -f xxx-service.yaml -f xxx-rc.yaml

根据目录下所有的 yaml 文件定义内容进行创建

kubectl create -f <目录>

使用 url 来创建资源

kubectl create -f https://git.io/vPieo

查看资源对象

查看所有 Node 或 Namespace 对象

kubectl get nodes

kubectl get namespace

查看所有 Pod 对象

# 查看子命令帮助信息

kubectl get --help

# 列出默认namespace中的所有pod

kubectl get pods

# 列出指定namespace中的所有pod

kubectl get pods --namespace=test

# 列出所有namespace中的所有pod

kubectl get pods --all-namespaces

# 列出所有pod并显示详细信息

kubectl get pods -o wide

kubectl get replicationcontroller web

kubectl get -k dir/

kubectl get -f pod.yaml -o json

kubectl get rc/web service/frontend pods/web-pod-13je7

kubectl get pods/app-prod-78998bf7c6-ttp9g --namespace=test -o wide

kubectl get -o template pod/web-pod-13je7 --template={{.status.phase}}

# 列出该namespace中的所有pod包括未初始化的

kubectl get pods,rc,services --include-uninitialized

查看所有 RC 对象

kubectl get rc

查看所有 Deployment 对象

# 查看全部deployment

kubectl get deployment

# 列出指定deployment

kubectl get deployment my-app

查看所有 Service 对象

kubectl get svc

kubectl get service

查看不同 Namespace 下的 Pod 对象

kubectl get pods -n default

kubectl get pods -A

查看资源描述

显示 Pod 详细信息

kubectl describe pods/nginx-deployment-755c56db9f-5k4sj       #/后跟pod的完整name

kubectl describe pods my-pod

kubectl describe -f pod.json

查看 Node 详细信息

kubectl describe node node1

查看 RC 关联的 Pod 信息

kubectl describe pods

更新修补资源

滚动更新

# 滚动更新 pod frontend-v1

kubectl rolling-update frontend-v1 -f frontend-v2.json

# 更新资源名称并更新镜像

kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2

# 更新 frontend pod 中的镜像

kubectl rolling-update frontend --image=image:v2

# 退出已存在的进行中的滚动更新

kubectl rolling-update frontend-v1 frontend-v2 --rollback

# 强制替换; 删除后重新创建资源; 服务会中断

kubectl replace --force -f ./pod.json

# 添加标签

kubectl label pods my-pod new-label=awesome

# 添加注解

kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq

修补资源

# 部分更新节点

kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'

# 更新容器镜像;spec.containers.name 是必须的,因为这是合并的关键字

kubectl patch pod valid-pod -p \

    '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'

Scale 资源

# Scale a replicaset named 'foo' to 3

kubectl scale --replicas=3 rs/foo

# Scale a resource specified in "foo.yaml" to 3

kubectl scale --replicas=3 -f foo.yaml

# If the deployment named mysql's current size is 2, scale mysql to 3

kubectl scale --current-replicas=2 --replicas=3 deployment/mysql

# Scale multiple replication controllers

kubectl scale --replicas=5 rc/foo rc/bar rc/baz

删除资源对象

基于 xxx.yaml 文件删除 Pod 对象

# yaml文件名字按照你创建时的文件一致

kubectl delete -f xxx.yaml

删除包括某个 label 的 pod 对象

kubectl delete pods -l name=<label-name>

删除包括某个 label 的 service 对象

kubectl delete services -l name=<label-name>

删除包括某个 label 的 pod 和 service 对象

kubectl delete pods,services -l name=<label-name>

删除所有 pod/services 对象

kubectl delete pods --all

kubectl delete service --all

kubectl delete deployment --all

编辑资源文件

在编辑器中编辑任何 API 资源

# 编辑名为docker-registry的service

kubectl edit svc/docker-registry

直接执行命令

在寄主机上,不进入容器直接执行命令

执行 pod 的 date 命令,默认使用 pod 的第一个容器执行

kubectl exec mypod -- date

kubectl exec mypod --namespace=test -- date

指定 pod 中某个容器执行 date 命令

kubectl exec mypod -c ruby-container -- date

进入某个容器

kubectl exec mypod -c ruby-container -it -- bash

查看容器日志

直接查看日志

# 不实时刷新kubectl logs mypod

kubectl logs mypod --namespace=test

查看日志实时刷新

kubectl logs -f mypod -c ruby-container

管理工具

Kubernetes正在不断加快在云原生环境的应用,但如何以统一、安全的方式对运行于任何地方的Kubernetes集群进行管理面临着挑战,而有效的管理工具能够大大降低管理的难度。

K9s

k9s是基于终端的资源仪表板。它只有一个命令行界面。无论在Kubernetes仪表板Web UI上做什么,都可以在终端使用K9s仪表板工具进行相同的操作。k9s持续关注Kubernetes集群,并提供命令以使用集群上定义的资源。



未完待续...

最新经典文章,欢迎关注公众号

原文链接:https://www.jianshu.com/p/2cbdf5b65bb7




已有(1)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条