编程知识 cdmana.com

K8s gestion des ressources (opérations de base)

1. Base

Cet article est basé surk8s 1.22.1

# Vous pouvez voir l'allocation des ressources
kubectl describe node
# Vue d'ensemble de l'état des ressources
kubectl api-resources

1.1 apply

apply La commande peut créer une ressource en utilisant le profil

  • -f UtiliseryamlOujsonCréer une ressource, C'est aussi la façon la plus courante de
kubectl apply -f ./my1.yaml                   # Créer une ressource
kubectl apply -f ./my1.yaml -f ./my2.yaml     # Création avec plusieurs fichiers
kubectl apply -f ./dir                        # Créer une ressource basée sur tous les fichiers du manifeste dans le répertoire
kubectl apply -f https://git.io/vPieo         # De URL Créer une ressource dans

Créer à partir d'un flux de sortie standard

# Créer plusieursPod
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - sleep
    - "1000000"
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep-less
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - sleep
    - "1000"
EOF

# Créer plusieurs key De Secret
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: $(echo -n "s33msi4" | base64 -w0)
  username: $(echo -n "jane" | base64 -w0)
EOF

1.2 get

Liste une ou plusieurs ressources

Type Description
pods, pod, po ListepodInformation
replicationcontroller, rc Liste des contrôleurs de répliques
services, svc Liste des services
ds Liste des assemblages de démons
Paramètres Par défaut Description
-A, --all-namespace false Renvoie les ressources de tous les espaces de noms , Même si-n Ça ne marche pas non plus.
--chunk-size 500 Renvoie une grande liste sous forme de bloc , Au lieu de retourner toutes les listes à la fois .Passer0Pour désactiver.
--ignore-not-found false true: Ne pas signaler d'erreur lorsque la ressource n'est pas trouvée
-o, --output '' json,yaml,name,go-template,go-template-file,template,templatefile,jsonpath,jsonpath-as-json,jsonpath-file,custom-columns-file,custom-columns,wide

yaml: Paryaml Configuration détaillée de la sortie du format
wide: Exporter des informations plus détaillées dans une liste
name: Imprimer uniquement le nom de la ressource
json: Parjson Format détails de sortie
--server-print true Imprimer les informations de colonne spécifiques reçues du serveur , Par exemple,: STATUS(État de fonctionnement), RESTARTS(Nombre de redémarrages)
--show-labels false Afficher les étiquettes pour les paramètres de ressources correspondants
--sort-by '' Accepté jsonpath Expression, Par exemple, trié par nom podListe kubectl get pods --sort-by=.metadata.name
--template ''
-w, --watch false Surveiller les changements dans les ressources, Démarrer une mission permanente , Disponible enpod name Surveillance individuelle pod
-n, --namespace Espace de noms

1.3 describe

Afficher l'état détaillé d'une ou de plusieurs ressources , Inclure les ressources non initialisées par défaut .

2. Dépendance

2.1 Espace de noms namespace

  • namespacePour écrire: namespaces, namespace, ns

Catégoriser les ressources, Les services connexes sont placés dans le même espace de noms pour une gestion facile

# Créer un espace de noms 
kubectl create namespace
#  Espace de noms de requête 
kubectl get ns
#  Supprimer un espace de noms 
kubectl delete namespace NAME
# yaml Configuration
apiVersion: v1
kind: Namespace
metadata:
   name: repo-nexus
   labels:
     name: repo-nexus

k8s Le Cluster possède par défaut les éléments suivants: namespace

NAME              STATUS   AGE
default           Active   2d3h
kube-node-lease   Active   2d3h
kube-public       Active   2d3h
kube-system       Active   2d3h
  • Tous lesNAMESPACEDRessources, Doit être spécifié lors de la création namespace,Si non spécifié,La valeur par défaut seradefaultSous l'espace de noms

  • Même chose.namespace La ressource similaire sous ne peut pas être renommée , Différents types de ressources peuvent être renommés

  • C'est différent.namespace Les ressources similaires sous peuvent être renommées

  • Habituellement, lorsque le projet est utilisé , Nous créerons un sens commercial namespace Pour une intégration logique

2.2 apiVersion

apiVersion Sens
alpha EntréeK8s Versions candidates antérieures de la fonctionnalité ,Peut contenirBug, Finalement, pas nécessairement. K8s
beta Version testée ,Qui finiront par entrerK8s, Mais la fonction 、 La définition de l'objet peut changer .
stable Version stable pour une utilisation sûre
v1 stable Première version après la version , Contient plus d'objets de base
apps/v1 La version la plus utilisée ,CommeDeployment、ReplicaSets Tous sont entrés dans cette version

Types de ressources et apiVersionTableau comparatif( Les versions sont différentes. , Sous réserve des documents officiels )

Kind apiVersion
ClusterRoleBinding rbac.authorization.k8s.io/v1
ClusterRole rbac.authorization.k8s.io/v1
ConfigMap v1
CronJob batch/v1beta1
DaemonSet extensions/v1beta1
Node v1
Namespace v1
Secret v1
PersistentVolume v1
PersistentVolumeClaim v1
Pod v1
Deployment v1、apps/v1、apps/v1beta1、apps/v1beta2
Service v1
Ingress extensions/v1beta1
ReplicaSet apps/v1、apps/v1beta2
Job batch/v1
StatefulSet apps/v1、apps/v1beta1、apps/v1beta2

Accès rapide aux ressources et aux versions

kubectl explain pod
kubectl explain Pod.apiVersion

2.3 Clusternode label

# Requêtenode Informations existantes sur l'étiquette 
kubectl get nodes --show-labels
#  Étiquetage des noeuds 
kubectl label node k8s-n-1 component=mysql

2.4 configmap

Les variables de profil ou d'environnement couramment utilisées pour gérer les applications , Mettre des informations qui ne sont pas particulièrement sensibles

apiVersion: v1
kind: ConfigMap
metadata:
  name: xxxx
  namespace: default
data:
  # Configuration key: value
  MYSQL_HOST: "172.168.23.11"
  MYSQL_PORT: "3306"
kubectl create -f configmap.yaml

Création à l'aide d'un fichier texte

MYSQL_HOST=172.168.23.11
MYSQL_PORT=3306
kubectl create configmap xxx --form-env-file=xxx.txt -n default

2.5 secret

Gérer les informations sensibles , Par défautbase64 Stockage codé , Il existe trois types

  • Service Account: Pour accéder àKubernetes API, Oui.KubernetesCréation automatique, Et sera automatiquement monté sur PodDe/run/secrets/kubernetes.io/serviceaccountDans la table des matières; CréationServiceAccountAprès, podSpécifié dansserviceAccountAprès, Créer automatiquement ceci ServiceAccountCorrespondantsecret
  • Opaque: base64CodageSecret, Utilisé pour stocker les mots de passe , Clé, etc.;
  • kubernetes.io/dockerconfigjson: Pour le stockage privé docker registry Informations de certification pour
apiVersion: v1
kind: Secret
metadata:
  name: xxxx
  namespace: default
type: Opaque
data:
  # Configuration key: base64(value)
  MYSQL_USER: cm9vdA==
  MYSQL_PASSWD: MTIzNDU2
kubectl create -f configmap.yaml

Création à l'aide d'un fichier texte , Non requisbase64Codage

MYSQL_USER=rootMYSQL_PASSWD=123456
kubectl create secret generic xxx --form-env-file=xxx.txt -n default

3. Pod

  • pod Styles pris en charge : pods, pod, po

docker Les conteneurs sont programmés ,Ink8sEn grappes, La plus petite Unit é de programmation est Pod

  • Découplage du moteur du conteneur Docker、Rkt. Découplage de la conception de la plate - forme et de la réalisation concrète du moteur
  • Réseau de partage de conteneurs multiples |Stockage|Processus Espace, Les scénarios d'affaires pris en charge sont plus flexibles
# yamlapiVersion: v1kind: Pod  # Type de ressourcemetadata:  # Configuration de base  name: POD_NAME  namespace: MY_NS  labels:  # Voilà.podÉTIQUETAGE, Gestion facile,  À l'arrière, il y a une présentation.     component: POD_NAMEspec:  containers:  # Configuration du conteneur  - name: NAME1  # Nom du conteneur    image: IMAGE  #  Adresse de l'entrepôt miroir     env:  # Variables d'environnement    - name: MYSQL_HOST   #  Désignationroot Nom d'utilisateur de l'utilisateur       value: "127.0.0.1"    - name: MYSQL_PASSWD      value: "123456"    ports:  #  Port de fuite du conteneur     - containerPort: 8002  - name: mysql  # Unpod Peut avoir plusieurs conteneurs     image: mysql    ports:    - containerPort: 3306    env:    - name: MYSQL_ROOT_PASSWORD      value: "123456"    - name: MYSQL_DATABASE      value: "myblog"
# Créationpodkubectl create -f pod.yamlkubectl apply -f pod.yamlkubectl run --image=IMAGE POD_NAME # Pluskubectl run  Référence d'utilisation kubeclt run -h#  Les bases peuvent être obtenues par la mise en service yamlDocumentationkubectl run --image=nginx --dry-run -o yaml nginx#  Mise à jour de la version de service kubectl apply -f pod.yaml# Voirpod, -n  Spécifier un espace de noms , -o wide  Afficher plus d'informations ( Vous pouvez voir le noeud de programmation )kubectl get pods -o wide -n xxx# Voirpod Détails et événements pour kubectl describe pods -n xxx POD_NAME# VoirpodCompletyamlkubectl get pods -o yaml -n xxx POD_NAME# VoirPod Journal du contenu , Afficher les journaux de sortie standard ou d'erreur kubectl logs -n xxx -f POD_NAME -c CONTAINER_NAME# --tail Nombre limité de lignes , Similaire àdockerLes ordres docker logs --tail=10 -f xxxxxkubectl -n default logs -f --tail=10 nginx -c nginx# Supprimer le conteneurkubectl delete -f pod.yamlkubectl delete pod -n xxx POD_NAME# Dans le récipient, -c  Indique quel conteneur entrer kubectl -n xxx exec -it POD_NAME -c NAME1 bash# Utiliser -o wide Nous pouvons voirpod Où est la machine? ,  Donc le conteneur correspondant est dans cette machine #  Nous pouvons exécuter sur la machine correspondante  docker ps Voir les informations du conteneurdocker ps -a | grep NAME1# pod  Le format de nommage du conteneur dans est : k8s_<container_name>_<pod_name>_<pod_uuid>

3.1 Sélecteur de noeuds

  • nodeSelector Sélecteur de noeuds , Peut êtrepod Envoyé à quelqu'un labelDenodeAllez., SinodeN'existe pas, pod Ne sera pas créé correctement , Jusqu'ànode Est marqué en conséquence label Sera déployé automatiquement , Sans recréer
spec:  nodeSelector:   #  En utilisant le sélecteur de noeud Pod Envoyer à la spécification labelNode of    component: mysql   #  Spécifie que la sélection a mysqlÉtiquettenode

3.2 Persistance des données

Similaire àdocker Montage des données pour , Mais nous avons déjà monté tout seul. , Maintenant, nous l'utilisons dans le cluster volumes Le montage n'est également monté que sur pod Sur la machine , Quand nous serons de nouveau en ligne pod Il y a toujours un problème de données non trouvées lorsqu'elles sont envoyées à d'autres machines. , Ici, nous utilisonsnodeSelectorRésolution, Bien sûr, cette méthode n'est généralement pas utilisée dans la production.

...spec:  volumes:   - name: mysql-data    hostPath:      path: /opt/mysql/data  nodeSelector:    component: mysql  containers:  - name: mysql    image: mysql    ...    volumeMounts:    - name: mysql-data      mountPath: /var/lib/mysql

UtiliserPV+PVC Connexion à une solution de stockage distribuée

  • ceph
  • glusterfs
  • nfs

3.3 Service health check

Deux sondes

  • LivenessProbeSonde: Détection active , Utilisé pour déterminer si le contenant est vivant , C'est - à - dire:PodOui NonrunningStatut, SiLivenessProbeLa sonde a détecté un contenant malsain, EtkubeletOui.kill Chute du récipient , Et redémarrer selon la politique de redémarrage du conteneur , Si l'un ne contient pas LivenessProbeSonde, EtKubelet Considered container LivenessProbe La valeur de retour de la sonde est toujours réussie
  • ReadinessProbeSonde: Détection de la disponibilité , Utilisé pour détecter si le conteneur fournit correctement le Service , C'est - à - dire le conteneur ReadyOui NonTrue, Si la demande peut être reçue , SiReadinessProbeÉchec de la détection, Du conteneur ReadySeraFalse, Endpoint Controller Le Contrôleur va PodDeEndpointÀ partir deserviceEndpointSupprimer de la Liste, Ne plus envoyer de demandes à ce PodAllez., Jusqu'à ce que la prochaine sonde réussisse . ( Supprimer ceci Pod Ne pas participer à la réception des demandes ne transmet pas le trafic à cet endroit Pod)

Trois types

  • exec: Exécuter une commande, La valeur de l'état de retour est 0 Indique la santé du conteneur

  • httpGet: Envoyer unhttpDemande, Retour200-399 Indique la santé du conteneur

  • tcpSocket: Par conteneur IPEtPortMise en œuvreTCPVérifiez, Si une connexion peut être établie , Indique la santé du conteneur

Paramètres et implications

  • initialDelaySeconds: Combien de secondes faut - il attendre pour effectuer la première sonde après le démarrage?
  • perioSeconds: Fréquence de détection . Par défaut10Secondes, Minimum1Secondes
  • timeoutSeconds: Délai de détection . Par défaut1Secondes, Minimum1Secondes
  • successThreshold: Après défaillance de la sonde , Combien de fois au moins la détection continue est - elle réussie? . Par défaut1
  • failureThreshold: Après détection réussie , Combien de fois la détection continue a - t - elle échoué au moins pour être considérée comme un échec? . Par défaut3, Minimum1
spec:  containers:  - image: xxx    name: xxx    livenessProbe:  #  Spécifier la sonde ,  Peut également être spécifié ici  readinessProbe      # UtiliserhttpDemande, Conteneur de demande80 Port pour déterminer si le conteneur est vivant       httpGet:        path: /blog/index        port: 80        scheme: HTTP      initialDelaySeconds: 10  #  Combien de secondes faut - il attendre pour effectuer la première sonde après le démarrage du conteneur?       perioSeconds: 10  #  Fréquence de détection       timeoutSeconds: 2  #  Délai de détection 

3.4 Politique de redémarrage

PodPolitique de redémarrage pour(RestartPolicy)Appliquer àPod Tous les conteneurs à l'intérieur , Et seulement PodOùNodeParkubelet Jugement et redémarrage . Lorsqu'un contenant sort anormalement ou qu'un contrôle de santé échoue , kubeletSera basé surRestartPolicy Pour effectuer les opérations correspondantes . Pod Les politiques de redémarrage pour :Always、OnFailureEtNever,La valeur par défaut estAlways

  • Always: En cas de défaillance du conteneur ( Sortie normale ou non ),ParkubeletRedémarrer automatiquement le conteneur.
  • OnFailure: Lorsque le conteneur cesse de fonctionner et que le Code de sortie n'est pas 0Heure,ParkubeletRedémarrer automatiquement le conteneur.
  • Never: Quel que soit l'état de fonctionnement du conteneur ,kubelet Ne redémarrera pas le conteneur .
spec:  restartPolicy: Always  containers:  - name: xxx    image: xxx    args:   #  Sortie anormale analogique ,  Paramètres du conteneur     - /bin/sh    - -c    - sleep 10 && exit 1

3.5 Politique de retrait du miroir

spec:  containers:  - name: xxx    image: xxx    imagePullPolicy: IfNotPresent

Politique de retrait du miroir: Par défautIfNotPresent

  • Always: Toujours tirer le miroir , Même s'il y en a un localement, tirez - le de l'entrepôt.
  • IfNotPresent: Priorité locale , S'il n'y en a pas, allez à l'entrepôt.
  • Never: Utiliser uniquement le miroir local, Aucune erreur locale

3.6 PodRessources limitées

Attention!: Si l'utilisation de la mémoire dépasse la limite , Ça va déclencher le système. OOMMécanismes,CauseCPU Est une ressource compressible , Ne déclenchera pas Pod Sortie ou reconstruction

spec:
  containers:
  - name: xxx
    image: xxx
    resources:
      requests:
        memory: 100Mi
        cpu: 50m
      limits:
        memory: 100Mi
        cpu: 50m

requests:

  • Exigences minimales en matière de ressources pour l'utilisation des conteneurs , Rôle etschedulePhase, Dépendance à l'égard du jugement de l'allocation des ressources lors de l'ordonnancement des conteneurs
  • Seulement si la quantité de ressources disponibles pour l'allocation sur le noeud >=request Autoriser l'envoi du conteneur à ce noeud
  • request Le paramètre ne limite pas la ressource maximale disponible pour le conteneur
  • requests.cpu A été transformé en dockerDe--cpu-sharesParamètres, Aveccgroup cpu.sharesMême fonction( Peu importe le nombre d'hôtes cpuOu le noyau, --cpu-shares Les options sont réparties proportionnellement cpuRessources)
  • requests.memoryIl n'y a pas de correspondancedockerParamètres, Uniquement en tant que k8s Base de répartition

limits:

  • Le conteneur peut utiliser le plus de ressources
  • Set to0 Indique qu'il n'y a pas de limite aux ressources utilisées , Illimité
  • QuandpodMémoire supérieure àlimitHeure, Seraoom
  • QuandcpuPlus quelimitHeure, Ne sera paskill, Mais il est limité à limitValeur
  • limits.cpuSera transformé endockerDe-cpu-qiotaParamètres. Aveccgroup cpu.cfs_quota_usMême fonction
  • limits.memory Sera transformé en dockerDe-memoryParamètres. Utilisé pour limiter la mémoire maximale du conteneur

3.7 Réseau

Si dansPODUtilisé dans"hostNetwork: true"Configurer le réseau,pod L'application en cours d'exécution peut voir directement l'interface réseau de l'hôte , L'application et le port sont accessibles à toutes les interfaces réseau du réseau local où se trouve l'hôte. .Déclarationpod Le mode réseau pour hostMode, Même effet docker run --net=host

spec:  hostNetwork: true

3.8 Configuration de référence

3.8.1 Référencesconfigmap

spec:  containers:  - name: xxx    image: xxx    env:    - name: MYSQL_HOST      valueFrom:        configMapKeyRef:          name: xxx          key: MYSQL_HOST    - name: MYSQL_PORT      valueFrom:        configMapKeyRef:          name: xxx          key: MYSQL_PORT    - name: MYSQL_DATABASE      value: "xxx"

3.8.2 Référencessecret

spec:  containers:  - name: xxx    image: xxx    env:    - name: MYSQL_USER      valueFrom:        secretKeyRef:          name: xxx          key: MYSQL_USER    - name: MYSQL_ROOT_PASSWORD      valueFrom:        secretKeyRef:          name: xxx          key: MYSQL_PASSWD    - name: MYSQL_DATABASE      value: "xxx"

3.9 pod Cycle de vie

Pod Description de la valeur de l'état

  • Pending: API Server Créé Pod, En attente de l'ordonnancement .
  • ContainerCreating: Tirer dans le conteneur de démarrage du miroir
  • Runnung: Pod Tous les conteneurs à l'intérieur ont été créés , Et au moins un conteneur fonctionne 、 État de démarrage ou état de redémarrage .
  • Succeeded| Completed: Pod Sortie après que tous les conteneurs à l'intérieur ont été exécutés avec succès , Et ne redémarrera pas .
  • Failed | Error: Pod Tous les conteneurs à l'intérieur sont sortis , Mais au moins un conteneur a quitté l'état défaillant .
  • CrashLoopBackOff: Pod Impossible de démarrer le conteneur à l'intérieur , Par exemple, la perte de profil entraîne l'échec du démarrage du processus principal
  • Unknown: Impossible d'obtenir ceci pour une raison quelconque PodÉtat de, Peut être causé par une mauvaise communication réseau .

Initialiser le conteneur(init)

  • Vérifier que tous les composants dépendants de l'application commerciale ont commencé
  • Modifier les permissions du Répertoire
  • Ajuster les paramètres du système

ValidationPodCycle de vie

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: default
  labels:
    component: nginx
spec:
  # En affairespod Démarrage avant démarrage ,  Peut être utilisé pour traiter certaines affaires pod Quelques travaux avant le démarrage 
  initContainers:
  - name: nginx1
    image: nginx
    #  Écrire l'heure et l'étiquette du fichier après le démarrage du conteneur 
    command: ['sh', '-c', 'echo $(date +%s): INIT >> /loap/timing']
    volumeMounts:
    - mountPath: /loap
      name: timing
  containers:
  - name: nginx2
    image: nginx
    command: ['sh', '-c', 'echo $(date +%s): START >> /loap/timing; sleep 10; echo $(date +%s): END >> /loap/timing;']
    volumeMounts:
    - mountPath: /loap
      name: timing
    livenessProbe:  #  Sonde de détection active 
      exec:
        command: ['sh', '-c', 'echo $(date +%s): LIVENESS >> /loap/timing']
    readinessProbe:  #  Sonde de disponibilité 
      exec:
        command: ['sh', '-c', 'echo $(date +%s): READINESS >> /loap/timing']
    lifecycle:  # Cycle de vie
      postStart:  #  Déclenché lorsque le conteneur démarre 
        exec:
          command: ['sh', '-c', 'echo $(date +%s): POST-START >> /loap/timing']
      #  Il faut le tuer.  Pod Pour déclencher pre-stop hook,Si oui Pod Moi - même. Down Laisse tomber.,Ne sera pas exécuté pre-stop hook
      preStop:
        exec:
          command: ['sh', '-c', 'echo $(date +%s): PRE-STOP >> /loap/timing']
  volumes:
  - name: timing
    hostPath:
      path: /tmp/loap
kubectl apply -f nginx.yaml# Voirpod Machine kubectl get pod -o wide# Inpod Afficher les fichiers sur la machine cat /tmp/loap/timing 
1630456396: INIT1630456398: START1630456398: POST-START1630456398: READINESS1630456406: LIVENESS1630456406: READINESS1630456408: END
# Supprimer le testpod,  Sinon, il n'y a pas de processus de résidence , pod Il va continuer à redémarrer. kubectl delete -f nginx.yaml

4. Controller

Les contrôleurs, également appelés charges de travail, sont utilisés pour mettre en œuvre la gestion pod Couche intermédiaire ,Assurez - vous quepod Ressources dans l'état prévu ,pod En cas de défaillance des ressources ,Je vais essayer. Redémarrer , Lorsque la politique de redémarrage est invalide , Sera créé à nouveau podRessources.

  • ReplicaSet: Créer un nombre spécifié de podNombre d'exemplaires,Assurez - vous quepod Nombre d'exemplaires conformes à l'état prévu , Et prend en charge les fonctions d'expansion et de réduction automatiques de la capacité de roulement
  • Deployment:Travailler dansReplicaSetAu - dessus de, Pour gérer les applications apatrides , Le meilleur Contrôleur pour le moment . Prise en charge des mises à jour et des retours en arrière , Fournir une configuration déclarative
  • DaemonSet: Utilisé pour s'assurer que chaque noeud du cluster n'exécute qu'un podCopie, Généralement utilisé pour effectuer des tâches de fond au niveau du système .Par exemple,EFKServices
  • Job: Quittez dès que vous avez terminé , Pas besoin de redémarrer ou de reconstruire
  • Cronjob: Contrôle périodique des tâches , Aucune opération de fond soutenue n'est nécessaire
  • StatefulSet: Gérer les applications stateful

4.1 Deployment

Deployment Styles pris en charge : deployment, deploy

apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx  namespace: defaultspec:  replicas: 1  # DésignationPodNombre de copies  selector:  # DésignationPodSélecteur pour    matchLabels:      app: nginx  template: # temlate Contenu et création podEssentiellement cohérent    metadata:      labels:  # Voilà.PodFrappe!label        app: nginx    spec:      containers:      - image: nginx        name: nginx        resources: {}      dnsPolicy: ClusterFirst      restartPolicy: Always
# CréationDeploymentkubectl create -f nginx.yaml kubectl create deploy --image=nginx nginx#  Base obtenue par mise en service yamlkubectl create deploy --image=nginx nginx --dry-run -o yaml# VoirDeployment, -n  Ajouter un espace de noms kubectl get deploy# Sera créé automatiquementreplicaSet, Vous pouvez voirkubectl get replicaset(rs) #  Supprimer avec créer un fichier Deploymentkubectl delete -f nginx.yaml # Mise à jour-- Exécuter après modification du profil applykubectl apply -f nginx.yaml#  Mise à jour en ligne , Similaire àvimÉditeur,  Mise à jour automatique après enregistrement kubectl edit deploy nginx#  Mise à jour avec commande directe kubectl set image deploy nginx nginx=nginx:1.21.1 --record

4.2 Nombre de copies

controller(Controller)Détection en temps réelpodStatut, Et s'assurer que le nombre d'exemplaires est toujours à la valeur attendue

spec:  replicas: 1  # DésignationPodNombre de copies
#  Nombre de copies modifiées kubectl scale deploy nginx --replicas=2#  De préférence en modifiant le fichier de configuration replicas Parameter re apply Pour modifier le nombre de copies ( Maintenir le profil en ligne avec la santé réelle )#  On en supprime un. pod,  Le Contrôleur recréera un kubectl delete pod nginx-6799fc88d8-7rppv
[[email protected] ~]# kubectl get podNAME                     READY   STATUS    RESTARTS   AGEnginx-6799fc88d8-7rppv   1/1     Running   0          9m5snginx-6799fc88d8-fnwqr   1/1     Running   0          56s[[email protected] ~]# kubectl delete pod nginx-6799fc88d8-7rppvpod "nginx-6799fc88d8-7rppv" deleted[[email protected] ~]# kubectl get podNAME                     READY   STATUS              RESTARTS   AGEnginx-6799fc88d8-fnwqr   1/1     Running             0          97snginx-6799fc88d8-grxfs   0/1     ContainerCreating   0          2s

4.3 PodStratégies d'expulsion

K8S Il y a une fonction spéciale appelée pod eviction, Dans certaines scènes, comme les noeuds NotReady, Ou lorsque les ressources sont insuffisantes ,Prends ça. pod Expulsion vers un autre noeud , C'est une question de protection des entreprises.

4.4 Mettre à jour la politique

spec:  replicas: 2  # DésignationPodNombre de copies  selector:  # DésignationPodSélecteur pour    matchLabels:      app: myblog  strategy:    rollingUpdate:      maxSurge: 25%      maxUnavailable: 25%    type: RollingUpdate #  Spécifier la méthode de mise à jour comme mise à jour progressive ,Politique par défaut,Adoptionkubectl get deploy -o yamlVoir

Contrôle des politiques :

  • maxSurge: Augmentation maximale , Se réfère au processus de mise à jour , Peut être comparé àreplicas Dépassement de la valeur de préréglage podNombre, Peut être une valeur fixe ou un pourcentage ,Par défautdesired PodsCompter25%. Arrondi vers le Haut lors du calcul (Par exemple,3.4,Prends - le.4), Jusqu'à replicas + maxSurge- Oui.pod
  • maxUnavailable: Se réfère au processus de mise à jour , Quelques - uns au plus pod Dans un état de non - service , Peut être une valeur fixe ou un pourcentage ,Par défautdesired PodsCompter25%. Arrondi vers le bas lors du calcul (Par exemple,3.6,Prends - le.3)
# On va le modifier.nginxVersion miroirkubectl set image deploy nginx nginx=nginx:1.21.1 --record#  Afficher les événements de mise à jour de défilement kubectl describe deploy nginx
Events:  Type    Reason             Age                  From                   Message  ----    ------             ----                 ----                   -------  Normal  ScalingReplicaSet  35s                  deployment-controller  Scaled up replica set nginx-54f48578cf to 1  Normal  ScalingReplicaSet  32s (x2 over 5m5s)   deployment-controller  Scaled down replica set nginx-6799fc88d8 to 2  Normal  ScalingReplicaSet  32s                  deployment-controller  Scaled up replica set nginx-54f48578cf to 2  Normal  ScalingReplicaSet  29s                  deployment-controller  Scaled down replica set nginx-6799fc88d8 to 1  Normal  ScalingReplicaSet  29s                  deployment-controller  Scaled up replica set nginx-54f48578cf to 3  Normal  ScalingReplicaSet  27s                  deployment-controller  Scaled down replica set nginx-6799fc88d8 to 0
  • Nous avons trois noeuds , Donc vous pouvez augmenter au maximum 1- Oui.pod, Jusqu'à0- Oui.pod Dans un état de non - service ( C'est - à - dire au moins trois podEn cours d'exécution)
  • 3 old pod, Augmentation du déclenchement de la politique augmentation réussie d'un pod, Échec du déclenchement de la politique réduite
  • 3 old pod + 1 new pod, Échec du déclenchement de la politique ajoutée , Réduction de la stratégie déclenchée avec succès , Réduire d'un ancien pod
  • 2 old pod + 1 new pod, Ajouter1Diminution0
  • 2 old pod + 2 new pod, Ajouter0Diminution1
  • 1 old pod + 2 new pod, Ajouter1Diminution0
  • 1 old pod + 3 new pod, Nouveaupod Nombre de demandes satisfaites , Vieux.podDiminution1
  • 3 new pod Mise à jour terminée

4.5 Service rollback

Les politiques de mise à niveau peuvent être mises à niveau en douceur en faisant défiler les mises à niveau Deployment, En cas de problème de mise à niveau , Nécessite le moyen le plus rapide et le plus efficace de revenir à la dernière version disponible pour un bon fonctionnement .À cette fin,K8S Fournit un mécanisme de rollback

revision: Lors de la mise à jour de l'application ,K8S Enregistre le numéro de version actuel ,C'est - à - dire:revision, En cas de problème de mise à niveau , Peut être retourné à un revision,Configuration par défaut,K8S Seuls les plus récents seront conservés. revision,Peut passerDeploymentDans le profilspec.revisionHistoryLimit Augmentation des attributs revisionNombre,Par défaut10.

#  Voir la version actuelle et l'historique de la version , Si oui<none> Parce qu'il n'a pas été créé et mis à jour --record kubectl rollout history deploy nginx#  Enlevons le service et reconstruisons - le. kubectl delete -f nginx.yamlkubectl apply -f nginx.yaml --record#  Et le modifier kubectl set image deploy nginx nginx=nginx:1.21.1 --record#  Revoir la version historique kubectl rollout history deploy nginx
[[email protected] ~]# kubectl rollout history deploy nginxdeployment.apps/nginx REVISION  CHANGE-CAUSE1         kubectl apply --filename=nginx.yaml --record=true2         kubectl set image deploy nginx nginx=nginx:1.21.1 --record=true
#  Retour à la version spécifique kubectl rollout undo deploy nginx --to-revision=1
[[email protected] ~]# kubectl rollout undo deploy nginx --to-revision=1deployment.apps/nginx rolled back[[email protected] ~]# kubectl rollout history deploy nginxdeployment.apps/nginx REVISION  CHANGE-CAUSE2         kubectl set image deploy nginx nginx=nginx:1.21.1 --record=true3         kubectl apply --filename=nginx.yaml --record=true

Nous avons vu que l'histoire qui aurait dû ajouter un autre enregistrement n'en avait que deux. , Parce que1Et3 C'est la même version. , Un seul.

5. Service

serviceAlias: services, service, svc

Par dessus,Capable de passer à traversDeployment Pour créer un groupe Pod Pour fournir des services hautement disponibles . Bien que chaque Pod Un seul sera attribué Pod IP, Mais il y a deux problèmes: :

  • Pod IP Seulement les virtuels visibles dans le cluster IP, Impossible d'accéder à l'extérieur
  • Pod IPVa suivrePod Et disparaît ,QuandReplicaSetC'est exact.Pod Lors de l'expansion dynamique ,Pod IP Ça peut changer n'importe quand, n'importe où. , Cela rend difficile l'accès au service

5.1 ServiceÉquilibrer la chargeCluster IP

serviceC'est un groupe.pod Résumé du service pour , équivalent à un groupe podDeLB, Responsable de la distribution des demandes aux homologues pod.service Pour ça. LBFournir unIP,Généralement appelécluster IP .UtiliserServiceObjet,Adoptionselector Sélection des étiquettes ,Trouver la correspondancePod

apiVersion: v1kind: Servicemetadata:  name: nginx  namespace: defaultspec:  ports:  - port: 80    protocol: TCP    targetPort: 80  selector:    app: nginx  type: ClusterIP
# Création
kubectl apply -f svc-nginx.yaml
kubectl expose deployment nginx --port=80 --type=ClusterIP
# Voirsvc
kubectl get svc
# Supprimer
kubectl delete svc nginx
# VoirsvcDétails
kubectl describe svc nginx
[[email protected] ~]# kubectl describe svc nginx
Name:              nginx
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx   # D'après çalabel Filtrer ses manipulations pod
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.1.156.133
IPs:               10.1.156.133
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.2.1.12:80,10.2.2.7:80
Session Affinity:  None
Events:            <none>

Nous pouvons maintenant l'utiliser à l'intérieur du cluster 10.1.156.133 Pour accéder au service

5.1.1 Endpoint

service Pendant que l'objet est créé , Le même nom sera créé endpointsObjet, Si le service est configuré readinessProbe, QuandreadinessProbe En cas d'échec de la détection ,endpoints Les correspondances seront supprimées de la Liste pod_ip, De cette façon, le trafic ne sera pas distribué aux tests de santé échoués PodMoyenne

# Voirendpoint, AvecserviceDansEndpointsContenu cohérentkubectl get endpoints nginx

5.1.2 Problèmes existants

Actuellement utiliséhostNetworkDéploiement, Doit passer par l'hôte hôte ip+portAccès à, Les questions suivantes se posent:

  • Utilisation du servicehostNetwork, Provoque une fuite massive du port de l'hôte hôte ,Danger potentiel pour la sécurité
  • Risque de conflit de port

Tous les services appartiennent à k8sCluster,Utilisez autant que possiblek8s Accès au réseau pour , Il est donc possible myblogAccès àmysql Pour transformer :

  • Pourmysql Créer une ancre clusterIpDeService,Prends ça.clusterIpConfiguré dansmyblog Dans les variables d'environnement
  • Tirer parti de la découverte de services groupés , Passage entre les composants service namePour visiter

5.2 Découverte de services

Ink8sEn grappes, Les composants peuvent être définis Service Nom implémenter la communication

Bien quepodipEtclusterip Pas fixé. ,Maisservice nameC'est fixe., Et une portabilité complète entre les grappes , Donc, en même temps que les appels entre les composants ,C'est parfait.service name Pour communiquer , Cela évite beaucoup ipFrais d'entretien, Rendre le Service yaml Les modèles sont plus simples .

#  Un autre service ,  Pour vérifier kubectl create deployment tomcat --image=tomcatkubectl expose deployment tomcat --port=8080 --type=ClusterIP# Encore.tomcat Demande dans le conteneur nginxServiceskubectl exec -it tomcat-7d987c7694-qgfxv -- bash# Peut être utilisé directementsvc nameServices d'accèscurl nginx# Voirpod Résoudre la configuration cat /etc/resolv.conf
[email protected]:~# cat /etc/resolv.confnameserver 10.1.0.10search default.svc.cluster.local svc.cluster.local cluster.localoptions ndots:5
# Au - dessus10.1.0.10- Oui.dnsDeip[[email protected] ~]# kubectl get svc -n kube-systemNAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGEkube-dns   ClusterIP   10.1.0.10    <none>        53/UDP,53/TCP,9153/TCP   10d

DémarragepodQuand,Il vakube-dnsServicescluster-ip Adresse injectée dans podDeresolve Résoudre la configuration , Ajouter le namespaceDesearchDomaine. Donc à travers namespaceAdoptionservice name Si vous visitez ,Besoin d'ajouter unnamespaceNom

# Selonresolv.confConfiguration de,  Les adresses suivantes sont disponibles sur demande nginxServicescurl nginxcurl nginx.default  #  Permet la communication entre les espaces de noms curl nginx.default.svccurl nginx.default.svc.cluster.local

5.3 ServiceÉquilibrer la chargeNodePort

cluster-ip Est une adresse virtuelle ,Seulement dansk8s Accès interne au cluster , Cluster externe si vous accédez aux services internes , Une façon de le faire est d'utiliser NodePortComment.NodePort Par défaut à 30000-32767 , Non spécifié utilise l'un d'eux au hasard

apiVersion: v1kind: Servicemetadata:  name: nginx  namespace: defaultspec:  ports:  - port: 80    protocol: TCP    targetPort: 80  selector:    app: nginx  type: NodePort
# Créationkubectl apply -f svc-nginx.yamlkubectl expose deployment nginx2 --port=80 --type=NodePort
#  Machine disponible après le démarrage ip(ArbitrairenodeTout va bien.)+portAccès ànginxService renducurl 192.169.8.1:31429curl 192.169.8.2:31429curl 192.169.8.3:31429

Nous pouvons également accéder à nginxServices

5.4 kube-proxy

Exécuter sur chaque noeud ,Écouter API Server Changements dans les objets de service , Ensuite, la transmission du réseau peut être réalisée en créant des règles de routage du trafic. .Documents officiels

Il y a trois modes:

  • User space, Jean Kube-Proxy Écouter un port dans l'espace Utilisateur ,Tous les Service Tous transmis à ce port ,Et puis Kube-Proxy Il est transmis au niveau interne de l'application , Tous les messages passent par l'utilisateur , Faible performance ,k8s v1.2 Jeter après la version
  • Iptables, Mode par défaut actuel ,Entièrement IPtables Pour réaliser, Par le biais de nodeSur le noeudiptables Règles à appliquer serviceÉquilibrage de la charge,Mais avecservice Augmentation de la quantité ,iptables Motif en raison de la correspondance de recherche linéaire 、 Mise à jour complète et autres caractéristiques , Les performances diminuent considérablement
  • IPVS, AveciptablesEncore une fois, sur la baseNetfilter, Mais adopté hashTableau,Donc quandservice Lorsque la quantité atteint une certaine échelle ,hash L'avantage de vitesse de la table de recherche apparaîtra ,Pour améliorerservice Performance du service pour . k8s 1.8 Début de l'introduction de la version ,1.11 La version commence à se stabiliser , Besoin d'activer l'hôte ipvsModule

iptables Schéma du mode :

[[email protected] ~]# iptables-save | grep "default/nginx"
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/nginx" -m tcp --dport 31429 -j KUBE-SVC-2CMXP7HKUVJN7L6M
-A KUBE-SEP-QEWF37NALXUNKCQB -s 10.2.1.13/32 -m comment --comment "default/nginx" -j KUBE-MARK-MASQ
-A KUBE-SEP-QEWF37NALXUNKCQB -p tcp -m comment --comment "default/nginx" -m tcp -j DNAT --to-destination 10.2.1.13:80
-A KUBE-SEP-THS5ZWJX3A5H6VN4 -s 10.2.1.12/32 -m comment --comment "default/nginx" -j KUBE-MARK-MASQ
-A KUBE-SEP-THS5ZWJX3A5H6VN4 -p tcp -m comment --comment "default/nginx" -m tcp -j DNAT --to-destination 10.2.1.12:80
-A KUBE-SERVICES -d 10.1.162.20/32 -p tcp -m comment --comment "default/nginx cluster IP" -m tcp --dport 80 -j KUBE-SVC-2CMXP7HKUVJN7L6M
-A KUBE-SVC-2CMXP7HKUVJN7L6M ! -s 10.2.0.0/16 -d 10.1.162.20/32 -p tcp -m comment --comment "default/nginx cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
-A KUBE-SVC-2CMXP7HKUVJN7L6M -p tcp -m comment --comment "default/nginx" -m tcp --dport 31429 -j KUBE-MARK-MASQ
-A KUBE-SVC-2CMXP7HKUVJN7L6M -m comment --comment "default/nginx" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-THS5ZWJX3A5H6VN4
-A KUBE-SVC-2CMXP7HKUVJN7L6M -m comment --comment "default/nginx" -j KUBE-SEP-QEWF37NALXUNKCQB

6. Kubernetes Accès au service Ingress

PourKubernetesDeService,Que ce soitCluster-IpEtNodePort Sont des charges à quatre niveaux , Comment réaliser l'équilibrage de la charge à sept niveaux pour les services dans le cluster , Cela nécessite l'aide Ingress,Ingress Il existe de nombreuses façons d'implémenter un contrôleur ,Par exemple,nginx, Contour, Haproxy, trafik, Istio.

Ingress-nginx- Oui.7 Équilibreur de charge pour les couches , Responsable de la gestion unifiée des paires externes k8s clusterMoyenneServiceDemandes.Comprend principalement::

  • ingress-nginx-controller: Écrit par l'utilisateur ingressLes règles(CrééingressDeyamlDocumentation), Changement dynamique nginxProfil du service,Etreload Surcharger pour qu'il prenne effet (Est automatisé,AdoptionluaScript pour implémenter);
  • IngressObjet de la ressource:Oui.Nginx La configuration de IngressObjet

Logique de mise en œuvre

  • ingress controllerAdoption etkubernetes apiInteraction, Dans un Cluster dynamique de désensibilisation ingress Modification des règles

  • Et lisezingressLes règles( La règle est de dire quel nom de domaine correspond à lequel service), Selon des règles personnalisées , Générer un segment nginxConfiguration

  • Écris encore. nginx-ingress-controllerDepod- Oui.,C'estIngress controllerDepod Il y en a un. NginxServices, Le Contrôleur a généré nginx Configurer l'écriture /etc/nginx/nginx.confDans le document

  • Et puisreload Pour que la configuration prenne effet . Le problème de la configuration et de la mise à jour dynamique des noms de domaine est atteint.

6.1 Installation

Documents officiels

#  En général, il peut être téléchargé plusieurs fois. 
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml
sed -i "s#k8s.gcr.io/ingress-nginx/controller:v1.0.0.*#registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.0.0#" deploy.yaml
sed -i "s#k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0.*#hzde0128/kube-webhook-certgen:v1.0#g" deploy.yaml
kubectl apply -f deploy.yaml
kubectl get pod -n ingress-nginx -owide 
kubectl describe pod -n ingress-nginx 
# Voirwebhook
kubectl get validatingwebhookconfigurations
# Supprimeringress-nginx-admission
kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission

6.2 Utiliser

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  # Peut passerkubectl get ingressclass VoiringressClassName
  ingressClassName: nginx
  rules:
    - host: nginx.openstudy.space
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                # Servicesservice name
                name: nginx
                port:
                  #  Ports ouverts au service 
                  number: 80
kubectl apply -f ingress.yaml
#  Aucun nom de domaine à ajouter hostsTests, Changez - vous enip
vi /etc/hosts
# 192.169.8.1 nginx.openstudy.space
yum -y install 
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig del flannel.1
ifconfig del cni0

ip link del flannel.1
ip link del cni0

yum -y install bridge-utils
brctl delbr flannel.1

kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

ip link del flannel.1
ip link del cni0
rm -rf /var/lib/cni/
rm -f /etc/cni/net.d/*
systemctl restart kubelet

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

版权声明
本文为[_ Bar _촯]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/09/20210914170658015m.html

Scroll to Top