K8S usa kubeadm para implementar e instalar el nodo del nodo maestro y el programador de implementación (Ubuntu 18.4)

Instalación de Kubernetes (Ubuntu 18.4)

Ubuntu18 Ali source
-backup /etc/apt/sources.list

cp /etc/apt/sources.list /etc/apt/sources.list.bak


--Modificar fuentes domésticas Reemplace /etc/apt/sources.list con lo siguiente

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

-Actualizar

sudo apt-get update

Uno, instalación de Docker

1. Actualizar el software del sistema

sudo apt-get update

2. Instale las dependencias de Docker y vim net-tools openssh-server

sudo apt-get install -y vim net-tools openssh-server apt-transport-https ca-certificates curl gnupg-agent software-properties-common

3. Agregar la clave secreta oficial de Docker

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

4. Verifique la huella digital

sudo apt-key fingerprint 0EBFCD88

5. Agregar almacén

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

6. Actualice el índice del paquete apt

sudo apt-get update

7. Instale la última versión de Docker.

sudo apt-get install -y docker-ce docker-ce-cli containerd.io

-Instalar la versión especificada
(1) Listar las versiones disponibles en el almacén

apt-cache madison docker-ce

(2) Instale la versión especificada. La segunda columna de la cadena es el número de versión, reemplace VERSION_STRING en el siguiente comando

sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

Dos, instala kubernetes

1. Cree un archivo de configuración

sudo touch /etc/apt/sources.list.d/kubernetes.list

2. Agregar permiso de escritura

sudo chmod 666 /etc/apt/sources.list.d/kubernetes.list 

3. Agregue contenido al archivo anterior

deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main

O usar

echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list

4. Actualiza la fuente del sistema operativo

sudo apt update

Produce un error de autenticación de firma
en Las siguientes firmas no se pudieron verificar
porque el público en La clave no ES el disponible: NO_PUBKEY
6A030B21BA07F4FB

5. Recuerde los últimos 8 dígitos de NO_PUBKEY anteriores, agregue la clave de autenticación y las claves van seguidas de los últimos 8 dígitos de NO_PUBKEY (BA07F4FB)

gpg --keyserver keyserver.ubuntu.com --recv-keys BA07F4FB

6. Ingrese el comando, OK significa éxito, preste atención a los últimos 8 bits de NO_PUBKEY

gpg --export --armor BA07F4FB | sudo apt-key add -

7. Actualice de nuevo la fuente de descarga del sistema.

sudo apt update

8. Deshabilite el firewall

sudo ufw disable

9. Cierre la partición de intercambio
(1) Cerrar

sudo swapoff -a

(2) Modifique el archivo de configuración y ciérrelo permanentemente

sudo sed -i 's/.*swap.*/#&/' /etc/fstab

10. Prohibir selinux
(1) Instalar comandos para manipular selinux

sudo apt install -y selinux-utils

(2) Prohibir Selinux

setenforce 0

(3) Reinicie el sistema operativo (es posible que Alibaba Cloud deba reiniciar la instancia)

shutdown -r now

(4) Compruebe si selinux se ha cerrado

sudo getenforce

11. Verifique si la partición de intercambio está cerrada

free -m

11. Instalar kubenetes

sudo apt-get install -y kubelet=1.18.5-00 kubeadm=1.18.5-00 kubectl=1.18.5-00 kubernetes-cni=0.8.6-00

12. Configure el inicio automático después del arranque

sudo systemctl enable kubelet && systemctl start kubelet

13. Reiniciar (Alibaba Cloud reinicia la instancia)

sudo shutdown -r now

14. Verifique la instalación e intente usar el comando kubectl

kubectl get nodes

Solicitará la conexión al servidor localhost: 8080 fue rechazado: ¿especificó el host o puerto correcto? (Lo que indica una instalación exitosa)

15. Ver la versión actual de kubernetes

kubectl version

Tres, la inicialización del nodo maestro.

1. Muestre el archivo de inicialización predeterminado de kubeadm, imprímalo y escríbalo en el archivo kubeadm-config.conf.

kubeadm config print init-defaults ClusterConfiguration> kubeadm-config.conf

2. Modifique el archivo kubeadm-config.conf

	advertiseAddress 改为本主节点地址(192.168.x.x)
	imageRepository 修改镜像源(registry.aliyuncs.com/google_containers)
	kubernetesVersion修改为对应版本
	添加子网网络
	networking:
 		dnsDomain: cluster.local
 		podSubnet: 10.244.0.0/16
		serviceSubnet: 10.96.0.0/12
	scheduler: {
    
    }

Aquí 10.244.0.0/16 y 10.96.0.0/12 son las redes de subred de pods y servicios en k8s respectivamente. Es mejor usar esta dirección, y es necesario usar la red de franela subsiguiente.

3. Compruebe qué archivos de imagen se deben extraer

kubeadm config images list --config kubeadm-config.conf

4. Tira de la imagen

kubeadm config images pull --config ./kubeadm-config.conf

Aquí puede tirar del espejo doméstico y cambiarle el nombre
5. Inicializar y comenzar

sudo kubeadm init --config ./kubeadm-config.conf

6. Guarde el contenido de salida, escríbalo en el archivo y utilícelo para unirse al nodo.

Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run the
following as a regular user:
 mkdir -p $HOME/.kube
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of
the options listed at:
 https://kubernetes.io/docs/concepts/clusteradministration/addons/
You can now join any number of machines by running
the following on each node
as root:
 kubeadm join 192.168.x.x:6443 --token
xxxxxx.xxxxxxxxxxxxxx --discovery-token-ca-certhash
sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

7. Copie el archivo admin.conf y cambie el propietario.

 mkdir -p $HOME/.kube
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config

8. Verificación

kubectl get nodes

En este momento NotReady
9, descarga franela

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

No se puede descargar la copia directamente

---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: psp.flannel.unprivileged
  annotations:
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
    seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
    apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
    apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:
  privileged: false
  volumes:
  - configMap
  - secret
  - emptyDir
  - hostPath
  allowedHostPaths:
  - pathPrefix: "/etc/cni/net.d"
  - pathPrefix: "/etc/kube-flannel"
  - pathPrefix: "/run/flannel"
  readOnlyRootFilesystem: false
  # Users and groups
  runAsUser:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  # Privilege Escalation
  allowPrivilegeEscalation: false
  defaultAllowPrivilegeEscalation: false
  # Capabilities
  allowedCapabilities: ['NET_ADMIN', 'NET_RAW']
  defaultAddCapabilities: []
  requiredDropCapabilities: []
  # Host namespaces
  hostPID: false
  hostIPC: false
  hostNetwork: true
  hostPorts:
  - min: 0
    max: 65535
  # SELinux
  seLinux:
    # SELinux is unused in CaaSP
    rule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: flannel
rules:
- apiGroups: ['extensions']
  resources: ['podsecuritypolicies']
  verbs: ['use']
  resourceNames: ['psp.flannel.unprivileged']
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: flannel
  namespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-system
  labels:
    tier: node
    app: flannel
data:
  cni-conf.json: |
    {
    
    
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
    
    
          "type": "flannel",
          "delegate": {
    
    
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
    
    
          "type": "portmap",
          "capabilities": {
    
    
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
    
    
      "Network": "10.244.0.0/16",
      "Backend": {
    
    
      "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni
        image: quay.io/coreos/flannel:v0.13.0-rc2
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.13.0-rc2
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg

10. Edite este archivo para asegurarse de que la red de franela sea
correcta y averigüe si el contenido de la etiqueta net-conf.json es correcto.

 net-conf.json: |
 {
    
    
 "Network": "10.244.0.0/16",
 "Backend": {
    
    
 "Type": "vxlan"
 }

Este "10.244.0.0/16" y la dirección de podsubnet en ./kubeadm-config.conf
deben ser coherentes.
11. Aplicar el archivo de configuración de franela actual

kubectl apply -f kube-flannel.yml

12. Configure el inicio automático en el arranque e inicie kubelet.

sudo systemctl enable kubelet
sudo systemctl start kubelet

En este momento, kubectl get nodos nuevamente mostrará el nodo maestro Listo

Cuarto, el nodo del nodo (inicialización) se une al clúster k8s existente

1. Envíe el archivo /etc/kubernetes/admin.conf del nodo maestro al host del nodo actual

scp /etc/kubernetes/admin.conf 节点1用户名@192.168.x.x:/home/xxx

2. Cree un entorno de archivo de configuración de kube (el admin.conf aquí se pasa del maestro)

mkdir -p $HOME/.kube
sudo cp -i $HOME/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

3. Únase al grupo

Aquí está el comando kubeadm join, que es el último resultado del comando cuando se inicializó el nodo maestro.

sudo kubeadm join 192.168.x.x:6443 --token xxxxxxxxxxxxxxx --discovery-token-ca-cert-hash  sha256:xxxxxxxxxxxxxxxxxxxxxx

Tenga en cuenta que el hash utilizado aquí debe ser el código hash generado después de que el host maestro kubeadm init tenga éxito.

P.ej:

kubeadm join 192.168.64.131:6443 --token xxxxx.xxxxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxx

El token es válido por 24 horas. Si el maestro necesita regenerar el token y el código hash durante más de 24 horas, también se puede generar de forma indefinida.

-Generar token

kubeadm token create

Catalogado como:

	[kubeadm] WARNING: starting in 1.8, tokens expire after 24 hours by default (if you require a non-expiring token use --ttl 0)
xxxxxx.xxxxxxxxxxxx

-Generar un código hash (el valor hash generalmente no cambia, el generado es el mismo que antes)

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

Catalogado como:

0fd95a9bc67a7bf0ef42da968a0d55d92e52898ec37asdfasfdadfa

Ver token

kubeadm token list

O use el siguiente comando para regenerar y generar token

kubeadm token create --print-join-command

4. Si el nombre de host es el mismo, se informará un error, modifique el nombre de host, archivo / etc / hostname

5. Puede encontrar los siguientes errores, elimine /etc/kubernetes/pki/ca.crt y luego únase a master

[ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists
rm /etc/kubernetes/pki/ca.crt

6. El host del nodo utiliza la red de franela
(1) para enviar kube-flannel.yml en el nodo principal al host del nodo actual

sudo scp kube-flannel.yml 节点1用户名@节点1ip:/home/xxx

(2) El nodo host habilita la red de franela

kubectl apply -f kube-flannel.yml

Cinco, desalojo manual del módulo (módulo creado por el programador de implementación)

(1) Configure el nodo donde se encuentra el pod en el estado no programable,
conduzca el Pod en el nodo del nodo (primero configure el nodo en el estado de cordón no programable y luego expulse el Pod)

kubectl drain <node name>

(2) Elimine el pod en el nodo (el pod se volverá a crear mediante la implementación en otros nodos en este momento, si no hay ningún nodo disponible, el pod estará en estado Pendiente)

kubectl delete pod <pod name>

(3) Eliminar nodo

kubectl delete node <node name>

-Restaurar el nodo a un estado programable

kubectl uncordon <node name>

El pod en estado pendiente se programará en el nodo en este momento

Seis, kubectl crea un programador de implementación y operaciones básicas de kubectl

1. Crea un archivo yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: mydeployment
 labels:
  app: myapp
spec:
 replicas: 1
 selector:
  matchLabels:
   app: app
 template:
  metadata:
   labels:
    app: app
  spec:
   hostNetwork: true
   dnsPolicy: ClusterFirstWithHostNet
   containers:
   - name: app1
     image: myapp:v1
     imagePullPolicy: IfNotPresent
     ports:
     - containerPort: 8880
   - name: app2
     image: myapp:v2
     imagePullPolicy: IfNotPresent
     ports:
     - containerPort: 8881

réplicas: 1 El número de réplicas de pod que se espera mantener.

En este caso, hostNetwork: true se utiliza para que el pod utilice la red del nodo. En este momento, el nodo no puede crear una copia del pod del valor esperado (conflicto de puerto).

image: la imagen y la versión utilizada por myapp: v2.

imagePullPolicy: IfNotPresent indica que si el nodo donde está ubicado el pod actual, use la duplicación local, si no, obtenga
puertos de almacenes remotos :
-containerPort: puerto 8880 expuesto por el contenedor, porque se usa hostNetwork: true, esta configuración es la misma .

2. Use el archivo yaml para crear un programador de implementación

kubectl apply -f xxxx.yaml --record

3. Ver el nodo del nodo

kubectl get node -o wide

4. Ver todos los grupos

kubectl get pod -o wide

5. Ver el grupo de anuncios especificado

kubectl  get pod <pod name>

6. Genere información de POD en formato JSON

kubectl get pod <pod name> --output json

7. Salida de información de POD en formato yaml

kubectl get pod <pod name> --output yaml

8. Eliminar pod

kubectl delete pod <pod name>

Los pods administrados por el programador de eliminación serán creados nuevamente por el programador para mantener el número deseado de pods.

9. Ver el programador de implementación

kubectl get deploy <deployment name> -o wide

10. Elimina el programador de implementación.

kubectl delete deploy <deployment name>

En este momento, todos los pods administrados por el programador saldrán uno tras otro.

11. Ver el nodo del nodo

kubectl get node -o wide

12. Eliminar el nodo nodo

kubectl delete node <node name>

Siete, actualización continua de implementación

1. Actualización de la aplicación (modificar la imagen del contenedor)

kubectl set image deployment <deployment name> <containers name>=<image name>:<tags>

2. Verifique el estado de la actualización

kubectl rollout status deployment <deployment name>

3. Ver versión histórica

kubectl rollout history deployment <deployment name>

4. Regrese a la versión anterior

kubectl rollout undo deployment <deployment name>

5. Regrese a la versión especificada

kubectl rollout undo deployment <deployment name> --to-revision=历史版本号

6. Escalado elástico (expansión en línea)

kubectl scale deployment <deployment name> --replicas=期望副本数量

8. Conéctese a Alibaba Cloud Private Warehouse

1. Ver secreto

kubectl get secret [-n 名称空间默认default]

Solo hay uno por defecto

root@master:~# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-cx7df   kubernetes.io/service-account-token   3      17d

2. Crea un secreto

kubectl create secret docker-registry ali-secret --namespace=default --docker-server=registry.cn-beijing.aliyuncs.com --docker-username=username --docker-password=password --docker-email=dockerEmail
 参数说明:
 ali-secret:secret名字
 --docker-serve:私有仓库地址
 --docker-username:私有仓库登录用户名
 --docker-password:私有仓库登录密码
 --docker-email:登录邮箱(可选)
 --namespace:指定命名空间 (可选) 

3. Marque uno más

root@master:~# kubectl get secret
NAME                  TYPE                                  DATA   AGE
ali-secret            kubernetes.io/dockerconfigjson        1      3m12s
default-token-cx7df   kubernetes.io/service-account-token   3      17d

4. Ver en formato yaml

kubectl get secret ali-secret -n default -o yaml

5. Uso de implementación

apiVersion: apps/v1
kind: Deployment
metadata:
 name: mydeployment
 labels:
  app: myapp
spec:
 replicas: 1
 selector:
  matchLabels:
   app: app
 template:
  metadata:
   labels:
    app: app
  spec:
   imagePullSecrets:
   - name: ali-secret (使用刚才创建的secret)
   hostNetwork: true
   dnsPolicy: ClusterFirstWithHostNet
   containers:
   - name: app1
     image: registry.cn-beijing.aliyuncs.com/xxx/xxx:[镜像版本号]
     imagePullPolicy: IfNotPresent
     ports:
     - containerPort: 8880
注意
指定使用的secret
   imagePullSecrets:
   - name: ali-secret (使用刚才创建的secret)
指定使用镜像的全名称:版本号
image: registry.cn-beijing.aliyuncs.com/xxx/xxx:[镜像版本号]

6. Ingrese al contenedor

kubectl exec <pod名> -c <容器名> -it /bin/bash

7. Ver detalles del grupo

kubectl describe pod [pod名]

Supongo que te gusta

Origin blog.csdn.net/weixin_44784018/article/details/107715262
Recomendado
Clasificación