Diretório de artigos
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
Pod
e o kubernetes geralmente não gerencia o pod diretamente, masPod控制器
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
Service
recursos para realizar essa função.Claro, se os dados do programa no Pod precisarem ser persistidos, o Kubernetes também fornece vários
存储
sistemas.
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 yaml2 Se você precisar colocar várias partes da configuração yaml em um arquivo, use
---
separadores no meio3 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
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
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
Como criar uma pesquisa de controlador
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
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
2.6 Usando a imagem do docker warehouse pessoal
// 从我的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 ~]#