fc013 发表于 2021-10-23 20:57:56

最新、最全、最详细的 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 等语言,强调以数据为中心,简洁易读,编写简单。



YAML 语法特性

学过编程的人理解起来应该非常容易


语法特点


[*]大小写敏感


[*]通过缩进表示层级关系


[*]禁止使用tab缩进,只能使用空格键


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


[*]使用#表示注释

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

资源清单

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

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

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

可以被应用使用的资源

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

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



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

资源控制器

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

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



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

服务发现

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



Kubernetes 之服务发现

Ingress 服务

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



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

数据存储

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



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

集群调度

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

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

公平

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

资源高效利用

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

效率

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

灵活

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

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



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

kubectl 使用指南

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

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

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



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集群,并提供命令以使用集群上定义的资源。



未完待续...

最新经典文章,欢迎关注公众号http://www.aboutyun.com/data/attachment/forum/201903/18/215536lzpn7n3u7m7u90vm.jpg
原文链接:https://www.jianshu.com/p/2cbdf5b65bb7




美丽天空 发表于 2021-10-25 23:44:46

感谢分享
页: [1]
查看完整版本: 最新、最全、最详细的 K8S 学习笔记总结(2021最新版)(二)