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
# 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
- 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 , ...
- 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 ...
- 【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 ...
- 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 ...
- 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 ...
- activitiOpérations de base
package activitiTest; import java.io.InputStream; import java.util.List; import java.util.zip.ZipInp ...
- 《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 ...
- 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 ...
- 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 ...
- 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
- 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: ...
- 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 ...
- 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. ...
- 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, ...
- javaRéalisationmapEtobject Trois méthodes d'échange
/** * Utiliserorg.apache.commons.beanutilsConversion */ class A { public static Object mapToObje ...
- 【LeetCodeExercices】Climbing Stairs
Climbing Stairs You are climbing a stair case. It takes n steps to reach to the top. Each time you c ...
- error1
#include<stdio.h>main(){ int a[10],i,m,n,j; for(i=3;i<10;i++) scanf("%d",&a ...
- 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 ...
- UtiliserjedisConnexionredis
1.ImporterjarSac,AjouterpomDépendance<dependency><groupId>redis.clients</groupId><artifactId>jedi ...
- 【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 ...