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: ParyamlConfiguration 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: ParjsonFormat 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 nompodListe kubectl get pods --sort-by=.metadata.name
--template ''
-w, --watch false Surveiller les changements dans les ressources, Démarrer une mission permanente, Disponible enpod nameSurveillance individuellepod
-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

k8sLe 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éationnamespace,Si non spécifié,La valeur par défaut seradefaultSous l'espace de noms

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

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

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

2.2 apiVersion

apiVersion Sens
alpha EntréeK8sVersions 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、ReplicaSetsTous sont entrés dans cette version

Types de ressources etapiVersionTableau 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êtenodeInformations 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éfautbase64Stockage codé, Il existe trois types

  • Service Account: Pour accéder àKubernetes API, Oui.KubernetesCréation automatique, Et sera automatiquement monté surPodDe/run/secrets/kubernetes.io/serviceaccountDans la table des matières; CréationServiceAccountAprès, podSpécifié dansserviceAccountAprès, Créer automatiquement ceciServiceAccountCorrespondantsecret
  • Opaque: base64CodageSecret, Utilisé pour stocker les mots de passe, Clé, etc.;
  • kubernetes.io/dockerconfigjson: Pour le stockage privédocker registryInformations 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

  • podStyles pris en charge: pods, pod, po

dockerLes conteneurs sont programmés,Ink8sEn grappes,La plus petite Unit é de programmation estPod

  • 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ésignationrootNom 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 # UnpodPeut 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'utilisationkubeclt run -h# Les bases peuvent être obtenues par la mise en serviceyamlDocumentationkubectl run --image=nginx --dry-run -o yaml nginx# Mise à jour de la version de servicekubectl 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# VoirpodDétails et événements pourkubectl describe pods -n xxx POD_NAME# VoirpodCompletyamlkubectl get pods -o yaml -n xxx POD_NAME# VoirPodJournal du contenu,Afficher les journaux de sortie standard ou d'erreurkubectl logs -n xxx -f POD_NAME -c CONTAINER_NAME# --tailNombre 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 entrerkubectl -n xxx exec -it POD_NAME -c NAME1 bash# Utiliser -o wide Nous pouvons voirpodOù 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 êtrepodEnvoyé à quelqu'unlabelDenodeAllez., SinodeN'existe pas, podNe sera pas créé correctement, Jusqu'ànodeEst marqué en conséquencelabelSera déployé automatiquement, Sans recréer
spec: nodeSelector: # En utilisant le sélecteur de noeudPodEnvoyer à la spécificationlabelNode of component: mysql # Spécifie que la sélection amysqlÉtiquettenode

3.2 Persistance des données

Similaire àdockerMontage des données pour, Mais nous avons déjà monté tout seul., Maintenant, nous l'utilisons dans le clustervolumesLe montage n'est également monté que surpodSur la machine, Quand nous serons de nouveau en lignepodIl 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+PVCConnexion à 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.killChute du récipient, Et redémarrer selon la politique de redémarrage du conteneur, Si l'un ne contient pasLivenessProbeSonde, EtKubeletConsidered containerLivenessProbeLa 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 conteneurReadyOui NonTrue, Si la demande peut être reçue, SiReadinessProbeÉchec de la détection, Du conteneurReadySeraFalse, Endpoint ControllerLe Contrôleur vaPodDeEndpointÀ partir deserviceEndpointSupprimer de la Liste, Ne plus envoyer de demandes à cePodAllez., Jusqu'à ce que la prochaine sonde réussisse. (Supprimer ceciPodNe pas participer à la réception des demandes ne transmet pas le trafic à cet endroitPod)

Trois types

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

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

  • tcpSocket: Par conteneurIPEtPortMise 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 demande80Port 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 àPodTous les conteneurs à l'intérieur, Et seulementPodOùNodeParkubeletJugement et redémarrage. Lorsqu'un contenant sort anormalement ou qu'un contrôle de santé échoue, kubeletSera basé surRestartPolicyPour effectuer les opérations correspondantes. PodLes 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 pas0Heure,ParkubeletRedémarrer automatiquement le conteneur.
  • Never:Quel que soit l'état de fonctionnement du conteneur,kubeletNe 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,CauseCPUEst une ressource compressible,Ne déclenchera pasPodSortie 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>=requestAutoriser l'envoi du conteneur à ce noeud
  • requestLe paramètre ne limite pas la ressource maximale disponible pour le conteneur
  • requests.cpuA été transformé endockerDe--cpu-sharesParamètres, Aveccgroup cpu.sharesMême fonction(Peu importe le nombre d'hôtescpuOu le noyau, --cpu-sharesLes options sont réparties proportionnellementcpuRessources)
  • requests.memoryIl n'y a pas de correspondancedockerParamètres, Uniquement en tant quek8sBase de répartition

limits:

  • Le conteneur peut utiliser le plus de ressources
  • Set to0Indique 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.memorySera transformé endockerDe-memoryParamètres. Utilisé pour limiter la mémoire maximale du conteneur

3.7 Réseau

Si dansPODUtilisé dans"hostNetwork: true"Configurer le réseau,podL'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éclarationpodLe mode réseau pourhostMode,Même effetdocker 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

PodDescription de la valeur de l'état

  • Pending: API ServerCrééPod,En attente de l'ordonnancement.
  • ContainerCreating: Tirer dans le conteneur de démarrage du miroir
  • Runnung: PodTous 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: PodSortie après que tous les conteneurs à l'intérieur ont été exécutés avec succès,Et ne redémarrera pas.
  • Failed | Error: PodTous les conteneurs à l'intérieur sont sortis,Mais au moins un conteneur a quitté l'état défaillant.
  • CrashLoopBackOff: PodImpossible 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 quelconquePodÉ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 affairespodDémarrage avant démarrage, Peut être utilisé pour traiter certaines affairespodQuelques 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# VoirpodMachinekubectl get pod -o wide# InpodAfficher les fichiers sur la machinecat /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, podIl 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 gestionpodCouche intermédiaire,Assurez - vous quepodRessources dans l'état prévu,podEn cas de défaillance des ressources,Je vais essayer. Redémarrer,Lorsque la politique de redémarrage est invalide,Sera créé à nouveaupodRessources.

  • ReplicaSet: Créer un nombre spécifié depodNombre d'exemplaires,Assurez - vous quepodNombre 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'unpodCopie,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

DeploymentStyles 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: # temlateContenu et créationpodEssentiellement 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 serviceyamlkubectl create deploy --image=nginx nginx --dry-run -o yaml# VoirDeployment, -n Ajouter un espace de nomskubectl get deploy# Sera créé automatiquementreplicaSet, Vous pouvez voirkubectl get replicaset(rs) # Supprimer avec créer un fichierDeploymentkubectl delete -f nginx.yaml # Mise à jour--Exécuter après modification du profilapplykubectl apply -f nginx.yaml# Mise à jour en ligne, Similaire àvimÉditeur, Mise à jour automatique après enregistrementkubectl edit deploy nginx# Mise à jour avec commande directekubectl 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éeskubectl scale deploy nginx --replicas=2# De préférence en modifiant le fichier de configurationreplicasParameter reapplyPour 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 unkubectl 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é àreplicasDépassement de la valeur de préréglagepodNombre, 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 pluspodDans 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éfilementkubectl 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 maximum1- Oui.pod, Jusqu'à0- Oui.podDans un état de non - service(C'est - à - dire au moins troispodEn cours d'exécution)
  • 3 old pod, Augmentation du déclenchement de la politique augmentation réussie d'unpod, É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 ancienpod
  • 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, NouveaupodNombre 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 à niveauDeployment,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,K8SFournit un mécanisme de rollback

revision:Lors de la mise à jour de l'application,K8SEnregistre le numéro de version actuel,C'est - à - dire:revision,En cas de problème de mise à niveau,Peut être retourné à unrevision,Configuration par défaut,K8SSeuls les plus récents seront conservés.revision,Peut passerDeploymentDans le profilspec.revisionHistoryLimitAugmentation des attributsrevisionNombre,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 modifierkubectl set image deploy nginx nginx=nginx:1.21.1 --record# Revoir la version historiquekubectl 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écifiquekubectl 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 que1Et3C'est la même version., Un seul.

5. Service

serviceAlias: services, service, svc

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

  • Pod IPSeulement les virtuels visibles dans le clusterIP,Impossible d'accéder à l'extérieur
  • Pod IPVa suivrePodEt disparaît,QuandReplicaSetC'est exact.PodLors 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.podRésumé du service pour,équivalent à un groupepodDeLB,Responsable de la distribution des demandes aux homologuespod.servicePour ça.LBFournir unIP,Généralement appelécluster IP .UtiliserServiceObjet,AdoptionselectorSé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 çalabelFiltrer ses manipulationspod
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

servicePendant que l'objet est créé,Le même nom sera crééendpointsObjet,Si le service est configuréreadinessProbe, QuandreadinessProbeEn cas d'échec de la détection,endpointsLes correspondances seront supprimées de la Listepod_ip,De cette façon, le trafic ne sera pas distribué aux tests de santé échouésPodMoyenne

# Voirendpoint, AvecserviceDansEndpointsContenu cohérentkubectl get endpoints nginx

5.1.2 Problèmes existants

Actuellement utiliséhostNetworkDéploiement, Doit passer par l'hôte hôteip+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 possiblek8sAccès au réseau pour,Il est donc possiblemyblogAccès àmysqlPour transformer:

  • PourmysqlCréer une ancreclusterIpDeService,Prends ça.clusterIpConfiguré dansmyblogDans les variables d'environnement
  • Tirer parti de la découverte de services groupés,Passage entre les composantsservice namePour visiter

5.2 Découverte de services

Ink8sEn grappes,Les composants peuvent être définisServiceNom implémenter la communication

Bien quepodipEtclusteripPas 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 namePour communiquer,Cela évite beaucoupipFrais d'entretien,Rendre le ServiceyamlLes modèles sont plus simples.

# Un autre service, Pour vérifierkubectl create deployment tomcat --image=tomcatkubectl expose deployment tomcat --port=8080 --type=ClusterIP# Encore.tomcatDemande dans le conteneurnginxServiceskubectl exec -it tomcat-7d987c7694-qgfxv -- bash# Peut être utilisé directementsvc nameServices d'accèscurl nginx# VoirpodRésoudre la configurationcat /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-ipAdresse injectée danspodDeresolveRésoudre la configuration,Ajouter lenamespaceDesearchDomaine. Donc à traversnamespaceAdoptionservice nameSi vous visitez,Besoin d'ajouter unnamespaceNom

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

5.3 ServiceÉquilibrer la chargeNodePort

cluster-ipEst une adresse virtuelle,Seulement dansk8sAccès interne au cluster,Cluster externe si vous accédez aux services internes,Une façon de le faire est d'utiliserNodePortComment.NodePortPar 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émarrageip(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.2Jeter après la version
  • Iptables, Mode par défaut actuel,Entièrement IPtables Pour réaliser, Par le biais denodeSur le noeudiptablesRègles à appliquerserviceÉquilibrage de la charge,Mais avecserviceAugmentation de la quantité,iptablesMotif 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 quandserviceLorsque la quantité atteint une certaine échelle,hashL'avantage de vitesse de la table de recherche apparaîtra,Pour améliorerservicePerformance du service pour. k8s 1.8Début de l'introduction de la version,1.11La version commence à se stabiliser,Besoin d'activer l'hôteipvsModule

iptablesSché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. KubernetesAccès au serviceIngress

PourKubernetesDeService,Que ce soitCluster-IpEtNodePortSont des charges à quatre niveaux,Comment réaliser l'équilibrage de la charge à sept niveaux pour les services dans le cluster,Cela nécessite l'aideIngress,IngressIl 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 externesk8s clusterMoyenneServiceDemandes.Comprend principalement::

  • ingress-nginx-controller:Écrit par l'utilisateuringressLes règles(CrééingressDeyamlDocumentation),Changement dynamiquenginxProfil du service,EtreloadSurcharger pour qu'il prenne effet(Est automatisé,AdoptionluaScript pour implémenter);
  • IngressObjet de la ressource:Oui.NginxLa configuration deIngressObjet

Logique de mise en œuvre

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

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

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

  • Et puisreloadPour 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 à ajouterhostsTests, 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

k8sGestion des ressources(Opérations de base)Autre article Afghanistan

  1. python Opérations de base et hdfsFonctionnement

    Table des matières Préface Opérations de base hdfsFonctionnement Résumé Un..Préface        En tant qu'ingénieur en pile,Doit maîtriser toutes les langues...HelloWorld. Récemment "Pousse." C'est parti. python La voie du développement , ...

  2. MYSQLOpérations de base

    MYSQLOpérations de base [TOC] 1.Définitions de base 1.1.Système de base de données relationnelle Un système de base de données relationnelle est un système de base de données basé sur un modèle relationnel Qu'est - ce qu'un modèle relationnel? ? 1. La structure des données peut être spécifiée , Même structure de données , Est une table bidimensionnelle ...

  3. 【Learning Python】【Chapitre II】PythonType de fondation et fonctionnement de la Fondation

    Type de fondation: Taille: py 3.0Résoudre le problème du débordement d'entiers, Cela signifie que les entiers ne doivent pas être considérés 32Bits,64Bits, Avec ou sans symboles, etc. , Tu en écris un. 1 Milliards ,C'est1 Milliards , Pas de débordement a = 10 ** 240 print(a) Exécution ...

  4. EmacsApprendre de l'expérience Opérations de base

    Auteur: Feng Xueting Origine:http://www.cnblogs.com/FengXueTing-px/ Bienvenue à la réimpression EmacsApprendre de l'expérience Opérations de base 1. Avant - propos et plan d'apprentissage 2.EmacsOpérations de base Un.. Préface et plan d'apprentissage ...

  5. GitOpérations de base

    Configurer la clé secrète 1. Vérifiez s'il y a une clé secrète sur cet ordinateur Vérifiez~/.ssh Voir si le nom est d_rsa.pubEtid_dsa.pubDe2Fichiers. $ ~/.sshbash: /c/Users/lenovo/.ssh: Is a ...

  6. activitiOpérations de base

    package activitiTest; import java.io.InputStream; import java.util.List; import java.util.zip.ZipInp ...

  7. 《Genesis-3D Moteur de jeu Open Source -Série d'enregistrements officiels tutoriels vidéo: Opérations de base 》

    Note::Cette série de tutoriels ne s'adresse qu'à l'éditeur de moteur:v1.2.2Et les versions suivantes G3DOpérations de base   Première leçon<G3D Discussion sur l'éditeur > G3D Introduction à l'éditeur ,S'appuyant sur une scène complexe,La vue de la scène et son fonctionnement de base sont expliqués, Du panneau de propriété et de la barre d'outils ...

  8. MYSQL Opérations de base

    1.MySQLOpérations de base Un.:MySQLOpérations de base 1:MySQL Copie du tableau Copier la structure de la table + Copier les données du tableau create table t3 like t1; --Créer un ett1 La même montre. ,Aveclike( La structure de la table est la même ...

  9. php Opérations de base des documents

    InphpL'opération de base sur le fichier est très simple,phpLa fonction fournie a été utilisée grossièrement une fois. file_get_contents():Accès au contenu du fichier accès au contenu d'une ressource réseau,C'estphpDonnez - moi un fichier de lecture plus rapide encapsulé à l'intérieur ...

  10. ArcGIS Pro Un tutoriel concis(2)Fonctionnement de base et dessin simple

    ArcGIS Pro Un tutoriel concis(2)Fonctionnement de base et dessin simple By Li yuanxiang Ce chapitre présente principalement ArcGIS ProComment charger les données et faire une carte simple, Opérations de base . Décrit dans la section précédente ,ArcGIS Pro Oui, c'est droit. ...

Recommandation aléatoire

  1. Fireeye Fire Eye publie un rapport ,Commentaires cyberespionnage en Chine

    2013Année10Mois2Jour,Fireeye Fire Eye publie un rapport ,Commentaires cyberespionnage en Chine-Fireeye(Beautiful National Fire Eye Company ) Publication du rapport < World Network Wars :Comprendre les intentions nationales derrière les cyberattaques>(World War C: ...

  2. System.Web.HttpRequestValidationException——Dangereux détecté du clientRequestValeur

    C'est une question assez courante,SiWeb Les entrées dans le formulaire sont similaires à Html Texte comme étiquette ,ParRequest.QueryStringOuRequest.Form En passant ces valeurs ,Ça déclenche une telle exception., Injection isométrique à partir du script ...

  3. CRUDDedeleteFonctionnement

    Dans les projets de l'entreprise deleteLes opérations suivantes sont traitées de deux façons 1.Rafraîchir la page d'accueil après la suppression réussie de l'arrière - plan 2.La page ne se rafraîchit pas après une suppression de fond réussie,Mais celui où se trouvent les donnéesdiv Sera rafraîchi une fois 3. Suppression de fond , Une suppression a été faite sur la page ,Supprimétd- Non. ...

  4. BZOJ3924 [Zjoi2015] Fantasy Township Strategic Games

    Description Aojiao girl youxiang joue à un jeu stratégique très intéressant,.À l'origine, la carte de ce jeu n'était pas trop grande, L'encens peut encore être maîtrisé. ,Mais je ne sais pas pourquoi les fabricants actuels de jeux en ligne font de plus en plus de cartes de jeu,Que l'odeur ne pouvait pas être vue du tout, ...

  5. javaRéalisationmapEtobject Trois méthodes d'échange

    /**  * Utiliserorg.apache.commons.beanutilsConversion  */  class A {              public static Object mapToObje ...

  6. 【LeetCodeExercices】Climbing Stairs

    Climbing Stairs You are climbing a stair case. It takes n steps to reach to the top. Each time you c ...

  7. error1

     #include<stdio.h>main(){ int a[10],i,m,n,j;   for(i=3;i<10;i++)    scanf("%d",&a ...

  8. ConstructionMyeclipseEn bas.Java WebEnvironnement de développement

    1.Préparez - vous. Télécharger le logiciel en premier :Myeclipse:http://www.xiazaiba.com/html/23858.html tomcat:http://files.cnblogs.com/files/l ...

  9. UtiliserjedisConnexionredis

    1.ImporterjarSac,AjouterpomDépendance<dependency><groupId>redis.clients</groupId><artifactId>jedi ...

  10. 【Coursera】Sixth Week(1)

    Transport Layer Après avoir étudié Link Layer(Ethernet),Internetwork Layer(IP)Après,On est là.TCP/IP Partie supérieure de la grappe de protocole . Review:Magic ...