Gerenciamento de recursos K8s (2)

2. Gestão de recursos

2.1 Introdução ao gerenciamento de recursos

No Kubernetes, todo o conteúdo é abstraído como recursos e os usuários precisam gerenciar o Kubernetes manipulando os recursos.

Em essência, o kubernetes é um sistema de cluster. Os usuários podem implantar vários serviços no cluster. O chamado serviço de implantação está, na verdade, executando contêineres um por um no cluster kubernetes e executando programas especificados nos contêineres.

A menor unidade de gerenciamento do kubernetes é o pod, e não o contêiner, portanto, o contêiner só pode ser colocado no contêiner Pode o kubernetes geralmente não gerencia o pod diretamente, mas Pod控制器gerencia o pod por meio dele.

Depois que o Pod puder fornecer serviços, é necessário considerar como acessar os serviços no Pod. O Kubernetes fornece Servicerecursos para realizar essa função.

Claro, se os dados do programa no Pod precisarem ser persistidos, o Kubernetes também fornece vários 存储sistemas.

insira a descrição da imagem aqui

Pod、Pod控制器、Service、存储O núcleo do aprendizado do kubernetes é aprender como operar vários recursos no cluster

2.2 Introdução à linguagem YAML

YAML é uma linguagem de marcação semelhante a XML e JSON. Ele enfatiza ser centrado em dados em vez de focado em marcação. Portanto, a definição de YAML em si é relativamente simples, conhecida como “uma linguagem de formato de dados amigável ao ser humano”.

<agan>
    <age>15</age>
    <address>Wuhan</address>
</agan>
agan:
  age: 15
  address: Wuhan

A sintaxe do YAML é relativamente simples, principalmente da seguinte forma:

  • Maiúsculas e minúsculas
  • Use recuo para indicar relacionamentos hierárquicos
  • Tabulações não são permitidas para recuo, apenas espaços são permitidos (restrição de versão baixa)
  • O número de espaços recuados não é importante, desde que os elementos do mesmo nível estejam alinhados à esquerda
  • '#' significa comentário

YAML oferece suporte aos seguintes tipos de dados:

  • escalar: um valor único e indivisível
  • Objeto: uma coleção de pares chave-valor, também conhecido como mapeamento/hash/dicionário
  • Matriz: Um conjunto de valores organizados em ordem, também conhecido como sequência (sequência) / lista (lista)
# 纯量, 就是指的一个简单的值,字符串、布尔值、整数、浮点数、Null、时间、日期
# 1 布尔类型
c1: true (或者True)
# 2 整型
c2: 234
# 3 浮点型
c3: 3.14
# 4 null类型 
c4: ~  # 使用~表示null
# 5 日期类型
c5: 2018-02-17    # 日期必须使用ISO 8601格式,即yyyy-MM-dd
# 6 时间类型
c6: 2018-02-17T15:02:31+08:00  # 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
# 7 字符串类型
c7: agan     # 简单写法,直接写值 , 如果字符串中间有特殊字符,必须使用双引号或者单引号包裹 
c8: line1
    line2     # 字符串过多的情况可以拆成多行,每一行会被转化成一个空格
# 对象
# 形式一(推荐):
agan:
  age: 15
  address: Wuhan
  
# 形式二(了解):
agan: {age: 15,address: Wuhan}
# 数组
# 形式一(推荐):
address:
  - 武昌
  - 江夏  
  
  
# 形式二(了解):
address: [武昌,江夏]

dica:

1 Lembre-se :de adicionar um espaço após escrever yaml

2 Se você precisar colocar várias partes da configuração yaml em um arquivo, use ---separadores no meio

3 A seguir está um site yaml para json, por meio do qual você pode verificar se o yaml está escrito corretamente

https://www.json2yaml.com/convert-yaml-to-json

2.3 Métodos de gestão de recursos

  • Gerenciamento imperativo de objetos: use comandos diretamente para operar recursos do Kubernetes

    kubectl run nginx-pod --image=nginx:1.17.1 --port=80

  • Configuração imperativa de objetos: opere recursos do Kubernetes por meio de configuração de comando e arquivos de configuração

    kubectl create/patch -f nginx-pod.yaml

  • Configuração declarativa de objetos: opere recursos do Kubernetes por meio de comandos de aplicação e arquivos de configuração

    kubectl apply -f nginx-pod.yaml

tipo objeto de operação Ambiente aplicável vantagem deficiência
gerenciamento imperativo de objetos objeto teste Simples Só pode operar objetos ativos, não pode auditar e rastrear
Configuração de objeto imperativa documento desenvolver Pode ser auditado e rastreado Quando o projeto é grande, existem muitos arquivos de configuração e a operação é problemática
Configuração declarativa de objeto Índice desenvolver Operações de diretório de suporte Difícil de depurar em situações inesperadas

2.3.1 Gerenciamento imperativo de objetos

comando kubectl

kubectl é uma ferramenta de linha de comando para o cluster kubernetes, por meio da qual o próprio cluster pode ser gerenciado e aplicativos em contêineres podem ser instalados e implantados no cluster. A sintaxe do comando kubectl é a seguinte:

kubectl [command] [type] [name] [flags]

comando : especifica a operação a ser executada no recurso, por exemplo create, get,delete

type : Especifique o tipo de recurso, como deployment, pod,service

name : o nome do recurso especificado, o nome diferencia maiúsculas de minúsculas

flags : especifique parâmetros opcionais adicionais

# 查看所有pod
kubectl get pod 
[root@k8s-master ~]# kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
dep-nginx-bdf687f67-tfsnm   1/1     Running   0          42h
pod-apache                  1/1     Running   0          36m

# 查看某个pod
kubectl get pod pod_name
[root@k8s-master ~]# kubectl get pod pod-apache -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
pod-apache   1/1     Running   0          37m   10.244.2.8   k8s-node2   <none>           <none>
[root@k8s-master ~]# 

# 查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml

Tipo de recurso

Todo o conteúdo do kubernetes é abstraído como recursos, que podem ser visualizados pelo seguinte comando:

kubectl api-resources

insira a descrição da imagem aqui


Os recursos usados ​​com frequência incluem o seguinte:

Classificação de recursos Nome do recurso abreviação função de recurso
Recursos em nível de cluster nós não componentes do cluster
espaços para nome ns Isolar pods
recurso de pod vagens depois carregando contêiner
controlador de recursos de pod controladores de replicação RC Controlar recursos de pod
conjuntos de réplicas rs Controlar recursos de pod
implantações implantar Controlar recursos de pod
conjuntos de daemons ds Controlar recursos de pod
empregos Controlar recursos de pod
cronjobs cj Controlar recursos de pod
horizontalpodautoscalers hpa Controlar recursos de pod
conjuntos de estados pontos Controlar recursos de pod
Recursos de descoberta de serviço Serviços serviço Interface externa do pod unificado
entrada ing Interface externa do pod unificado
recursos de armazenamento anexos de volume armazenar
volumes persistentes pv armazenar
reivindicações de volume persistente PVC armazenar
Configurar recursos mapas de configuração cm configuração
segredos configuração

operar

Kubernetes permite múltiplas operações em recursos, e você pode visualizar comandos de operação detalhados por meio de –help

kubectl --help  或者 kubectl --help | less

As operações usadas com frequência incluem o seguinte:

Classificação de comando Ordem traduzir função de comando
comando básico criar criar criar um recurso
editar editar editar um recurso
pegar Obtivermos obter um recurso
correção atualização (patch) atualizar um recurso
excluir excluir excluir um recurso
explicar explicar Exibir documentos de recursos
execute e depure correr correr Execute uma imagem especificada no cluster
expor expor Expor recursos como serviço
descrever descrever Exibir informações internas do recurso
Histórico Registrar registros do contêiner de saída no pod Produza os logs do contêiner no pod
anexar Enrolando em um contêiner em execução no contêiner em execução
executivo Execute um comando no contêiner Execute um comando no contêiner
CP cópia de Copie arquivos dentro e fora dos pods
sair da cama estréia Gerenciar a liberação de recursos
escala escala Expandir (diminuir) o número de pods
escala automática auto-ajuste Ajuste automaticamente o número de pods
comando avançado aplicar RC Configurar recursos por meio de arquivos
rótulo Rótulo Atualizar rótulos em recursos
outros comandos informações do cluster informações do cluster exibir informações do cluster
versão Versão Exibir a versão do servidor e cliente atual

A seguir está uma demonstração simples do uso dos seguintes comandos para a criação e exclusão de um namespace/pod:

# 查看当前有哪些 namespace 
[root@k8s-master ~]# kubectl get namespace
NAME              STATUS   AGE
default           Active   4d15h  // 如果你不指定使用哪个名称空间就会使用默认的这个
kube-flannel      Active   3d1h
kube-node-lease   Active   4d15h
kube-public       Active   4d15h
kube-system       Active   4d15h
[root@k8s-master ~]# 

# 创建一个namespace 叫 cloudsino
[root@k8s-master ~]# kubectl create namespace cloudsino
namespace/cloudsino created

# 获取namespace
[root@k8s-master ~]# kubectl get namespace
NAME              STATUS   AGE
cloudsino         Active   9s      # 这个是刚才创建的 cloudsino
default           Active   4d16h
kube-flannel      Active   3d1h
kube-node-lease   Active   4d16h
kube-public       Active   4d16h
kube-system       Active   4d16h

# 在此namespace下创建并运行一个nginx的Pod、指定运行在 cloudsino 中
[root@k8s-master ~]# kubectl run pod-name --image=nginx -n cloudsino //-n 表示指定使用哪个名称空间
pod/pod-name created
[root@k8s-master ~]# kubectl get pod   // 不指定,表示查看默认的名称空间
NAME                     READY   STATUS    RESTARTS   AGE
httpd                    1/1     Running   0          52m
httpd-7bb6557549-q4kfs   1/1     Running   0          87m
[root@k8s-master ~]# kubectl get pod -n cloudsino  // 需要指定cloudsino
NAME   READY   STATUS    RESTARTS   AGE
pod-name    1/1     Running   0          28s


# 删除指定的pod
[root@k8s-master ~]# kubectl delete pod pod -n cloudsino
pod "pod-name" deleted
[root@k8s-master ~]# kubectl get pod -n cloudsino
No resources found in cloudsino namespace.
[root@k8s-master ~]# 


# 删除指定的namespace
[root@k8s-master ~]# kubectl delete namespace cloudsino
namespace "cloudsino" deleted
[root@k8s-master ~]# kubectl get namespace
NAME              STATUS   AGE
default           Active   4d16h
kube-flannel      Active   3d1h
kube-node-lease   Active   4d16h
kube-public       Active   4d16h
kube-system       Active   4d16h

# kubectl run httpd --image=httpd --port=80  // 自主式pod,删除不会有接替的
# kubectl create deployment httpd --image=httpd // 这个是使用deployment类型创建的
# kubectl expose deployment httpd --port=80 --type=NodePort  // 暴露端口号

[root@k8s-master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
httpd                    1/1     Running   0          58m  # 自主式pod,删除不会有接替的
httpd-7bb6557549-q4kfs   1/1     Running   0          93m  # 这个是使用deployment类型创建的
[root@k8s-master ~]# kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
httpd   1/1     1            1           94m

insira a descrição da imagem aqui


insira a descrição da imagem aqui


insira a descrição da imagem aqui


2.3.2 Configuração imperativa de objetos

A configuração imperativa do objeto é usar comandos junto com arquivos de configuração para operar recursos do Kubernetes.

1) Crie um nginxpod.yaml com o seguinte conteúdo:

[root@k8s-master ~]# mkdir inventory  // 创建目录 inventory 存放yaml 文件
[root@k8s-master ~]# cd inventory/
[root@k8s-master inventory]# ls
[root@k8s-master inventory]# vi nginxpod.yaml
apiVersion: v1  // 版本是 V1
kind: Namespace  // 类型是名称空间
metadata:
  name: dev  // 名称空间叫 dev

---

apiVersion: v1
kind: Pod   // 类型是 Pod 类型
metadata:
  name: nginxpod  // Pod 名字叫nginxpod
  namespace: dev  // 这个pod 跑在dev 名称空间里
spec:
  containers:
  - name: nginx-containers  // 这个pod 里面跑的容器叫 nginx-containers
    image: nginx:latest  // 用的镜像是  nginx:latest 

As imagens a seguir ensinam como escrever arquivos no formato .yaml

Crie um método de pesquisa de pod

insira a descrição da imagem aqui


insira a descrição da imagem aqui


insira a descrição da imagem aqui


Como criar uma pesquisa de controlador

insira a descrição da imagem aqui


insira a descrição da imagem aqui


2) Execute o comando create para criar recursos:

[root@k8s-master inventory]# pwd
/root/inventory
[root@k8s-master inventory]# kubectl create -f nginxpod.yaml 
namespace/dev created
pod/nginxpod created

Neste momento, verificou-se que dois objetos de recursos foram criados, nomeadamente namespace e pod

3) Execute o comando get para visualizar os recursos:

[root@k8s-master inventory]# pwd
/root/inventory
[root@k8s-master inventory]# kubectl get -f nginxpod.yaml 
NAME            STATUS   AGE
namespace/dev   Active   29s

NAME           READY   STATUS    RESTARTS   AGE
pod/nginxpod   1/1     Running   0          29s
[root@k8s-master inventory]# kubectl get namespace
NAME              STATUS   AGE
default           Active   5d14h
dev               Active   48s    // 刚创建的 dev 名称空间
kube-flannel      Active   3d23h
kube-node-lease   Active   5d14h
kube-public       Active   5d14h
kube-system       Active   5d14h
[root@k8s-master inventory]# kubectl get -n dev pods // 查看所有在dev 的pod
NAME       READY   STATUS    RESTARTS   AGE
nginxpod   1/1     Running   0          69s
[root@k8s-master inventory]# kubectl get -n dev pod nginxpod // 指定查看哪个pod
NAME       READY   STATUS    RESTARTS   AGE
nginxpod   1/1     Running   0          76s
[root@k8s-master inventory]# 

Isso exibe as informações dos dois objetos de recursos

4) Execute o comando delete para excluir recursos:

[root@k8s-master inventory]# pwd
/root/inventory
[root@k8s-master inventory]# kubectl  delete -f nginxpod.yaml 
namespace "dev" deleted
pod "nginxpod" deleted

Neste momento, descobriu-se que dois objetos de recursos foram excluídos


总结:
    命令式对象配置的方式操作资源,可以简单的认为:命令  +  yaml配置文件(里面是命令需要的各种参数)

2.3.3 Configuração declarativa de objetos

A configuração declarativa de objetos é muito semelhante à configuração imperativa de objetos, mas possui apenas um comando apply.

# 首先执行一次kubectl apply -f yaml文件,发现创建了资源
[root@k8s-master inventory]# pwd
/root/inventory
[root@master ~]#  kubectl apply -f nginxpod.yaml
namespace/dev created
pod/nginxpod created

// 指定名称空间查看 Pod
[root@k8s-master inventory]# kubectl get pods -n dev
NAME       READY   STATUS    RESTARTS   AGE
nginxpod   1/1     Running   0          26s
[root@k8s-master inventory]# 

[root@k8s-master inventory]# cat nginxpod.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: dev

---

apiVersion: v1
kind: Pod
metadata:
  name: nginxpod
  namespace: dev
spec:
  containers:
  - name: nginx-containers
    image: nginx:latest


# 再次执行一次kubectl apply -f yaml文件,发现说资源没有变动
[root@k8s-master inventory]# pwd
/root/inventory
[root@master ~]#  kubectl apply -f nginxpod.yaml
namespace/dev unchanged
pod/nginxpod unchanged

[root@k8s-master inventory]# vim  nginxpod.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: dev

---

apiVersion: v1
kind: Pod
metadata:
  name: nginxpod
  namespace: dev
spec:
  containers:
  - name: nginx-containers
    image: nginx:latest

---

apiVersion: v1  // 在原先的基础上新加一个 Pod
kind: Pod  // 指定类型:Pod
metadata:
  name: apache  // Pod 名字叫:apache
  namespace:  // 没有指定用那个名称空间,默认使用default
spec:
  containers:
  - name: httpd  // 这个 pod 里面跑的容器叫 httpd
    image: httpd  // 用的镜像是 httpd
[root@k8s-master inventory]# 

[root@k8s-master inventory]# kubectl apply -f nginxpod.yaml 
namespace/dev unchanged  // 已存在,所以没有改变
pod/nginxpod unchanged   // 已存在,所以没有改变
pod/apache created    // 还没有存在所以创建
[root@k8s-master inventory]# kubectl get -n default pods
NAME                      READY   STATUS    RESTARTS   AGE
apache                    1/1     Running   0          2m51s
nginxs-64cdf86546-82dcc   1/1     Running   0          19h
[root@k8s-master inventory]# 
[root@k8s-master inventory]# kubectl get -n dev pods
NAME       READY   STATUS    RESTARTS   AGE
nginxpod   1/1     Running   0          10m
[root@k8s-master inventory]# 
总结:
    其实声明式对象配置就是使用apply描述一个资源最终的状态(在yaml中定义状态)
    使用apply操作资源:
        如果资源不存在,就创建,相当于 kubectl create
        如果资源已存在,就更新,相当于 kubectl patch

Extensão: o kubectl pode ser executado em nós?

A operação do kubectl precisa ser configurada. Seu arquivo de configuração é $HOME/.kube. Se você deseja executar este comando no nó do nó, você precisa copiar o arquivo .kube no nó mestre para o nó do nó, ou seja , execute-o no nó mestre Faça o seguinte:

scp  -r  HOME/.kube   node1: HOME/  # 哪个普通用户就放到哪个的对应用户里 

2.4. Simule o uso de usuários comuns para operar

Use k8s-node1 para simular

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
[tom@k8s-node1 ~]$ kubectl get nodes  // 普通用户使用不了 kubectl 
error: error loading config file "/etc/kubernetes/admin.conf": open /etc/kubernetes/admin.conf: permission denied
# 需要设置下面的操作

[root@k8s-node1 ~]# useradd tom  // 创建 tom 用户
[root@k8s-node1 ~]# id tom
uid=1000(tom) gid=1000(tom) groups=1000(tom)

[root@k8s-node1 ~]# su - tom  // 登录 tom 用户
[tom@k8s-node1 ~]$ mkdir -p $HOME/.kube
[tom@k8s-node1 ~]$ ls -a
.  ..  .bash_logout  .bash_profile  .bashrc  .kube

# 使用 root 不然没有权限
[root@k8s-node1 ~]# cp -i /etc/kubernetes/admin.conf ~tom/.kube/config 
[root@k8s-node1 ~]# chown -R tom.tom ~tom/.kube/

[tom@k8s-node1 ~]$ ll .kube/ -d
drwxrwxr-x 2 tom tom 20 Jan 10 10:04 .kube/
[tom@k8s-node1 ~]$ ll .kube/ 
total 8
-rw------- 1 tom tom 5637 Jan 10 10:04 config

[tom@k8s-node1 ~]$ echo $KUBECONFIG  // 因为之前使用管理员做的,所以需要把管理员做的那一步骤取消掉
/etc/kubernetes/admin.conf
[tom@k8s-node1 ~]$ export KUBECONFIG=
[tom@k8s-node1 ~]$ echo $KUBECONFIG

[tom@k8s-node1 ~]$ 

[tom@k8s-node1 ~]$ kubectl get nodes   // 设置完成之后就可以使用 kubectl 
NAME         STATUS   ROLES           AGE     VERSION
k8s-master   Ready    control-plane   5d16h   v1.26.0
k8s-node1    Ready    <none>          4d      v1.26.0
k8s-node2    Ready    <none>          3d23h   v1.26.0

Uso recomendado: Como os três métodos devem ser usados?

Criar/atualizar recursos usando configuração de objeto declarativokubectl apply -f XXX.yaml

Excluindo recursos usando configuração de objeto imperativakubectl delete -f XXX.yaml

Consultar recursos usando kubectl get(describe) o nome do recurso de gerenciamento de objetos imperativo


2.5 Alguns comandos básicos do kubectl

insira a descrição da imagem aqui


insira a descrição da imagem aqui


A imagem espelhada do nginx é executada no host k8s-node2. Se o host k8s-node2 cair repentinamente, o host k8s-node1 assumirá o controle

模拟 k8s-node2 主机宕机后 k8s-node1 主机会不会接替

// 关闭 k8s-node2 主机
[root@k8s-node2 ~]# shutdown -h now 

insira a descrição da imagem aqui


2.6 Usando a imagem do docker warehouse pessoal

insira a descrição da imagem aqui


insira a descrição da imagem aqui


//  从我的docker 仓库拉取镜像到本地来使用
[root@k8s-master ~]# kubectl create deployment httpd --image=tkl9639/httpd:v0.1
deployment.apps/httpd created
[root@k8s-master ~]# kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
httpd   0/1     1            0           22s
[root@k8s-master ~]# kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
httpd-7bb6557549-q4kfs   0/1     ContainerCreating   0          28s
[root@k8s-master ~]# kubectl get pods -o wide
NAME                     READY   STATUS              RESTARTS   AGE   IP       NODE        NOMINATED NODE   READINESS GATES
httpd-7bb6557549-q4kfs   0/1     ContainerCreating   0          32s   <none>   k8s-node2   <none>           <none>
[root@k8s-master ~]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
httpd-7bb6557549-q4kfs   1/1     Running   0          82s   10.244.2.5   k8s-node2   <none>           <none>
[root@k8s-master ~]# kubectl get deployment -o wide
NAME   READY UP-TO-DATE  AVAILABLE AGE   CONTAINERS IMAGES               SELECTOR
httpd  1/1   1           1         8m40s httpd      tkl9639/httpd:v0.1   app=httpd

// 暴露端口
[root@k8s-master ~]# kubectl expose deployment httpd --port=80 --type=NodePort
service/httpd exposed
[root@k8s-master ~]# kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/httpd-7bb6557549-q4kfs   1/1     Running   0          14m

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/httpd        NodePort    10.99.154.27   <none>        80:31073/TCP   18s
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        4d14h
service/nginx        NodePort    10.99.77.8     <none>        80:30035/TCP   2d18h
[root@k8s-master ~]# 
[root@k8s-master ~]# curl 10.99.154.27  // 集群IP
<html><body><h1>It works!</h1></body></html>
[root@k8s-master ~]# 

insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/m0_58805648/article/details/131978890
Recomendado
Clasificación