Kubernetes02-安装Kubernetes


1、系统要求

1.1、系统要求

  • Kubernetes系统由一组可执行程序组成,用户可以通过GitHub上的Kubernetes项目页下载编译好的二进制包,或者下载源代码并编译后进行安装。
  • 安装Kubernetes对软件和硬件的系统要求如表所示:

  • Kubernetes需要容器运行时(Container Runtime Interface,CRI)的支持,目前官方支持的容器运行时包括:Docker、Containerd、CRI-O和frakti。

1.2、安装前的准备(所有节点)

  • 需要注意的是,CentOS Linux 7默认启动了防火墙服务(firewalld),而Kubernetes的Master与工作Node之间会有大量的网络通信,安全的做法是在防火墙上配置各组件需要相互通信的端口号。在安全的内部网络环境中可以关闭防火墙服务:
]# systemctl stop firewalld.service
]# systemctl disable firewalld.service
  • 禁用SELinux,让容器可以读取主机文件系统:
--临时有效
]# setenforce 0

--永久有效。改系统文件/etc/sysconfig/selinux,然后重启Linux
]# vim /etc/sysconfig/selinux
SELINUX=disabled
  • 关闭交换空间(swap)
--关闭swap
]# swapoff -a
--注释掉swap
]# vim /etc/fstab
#/dev/mapper/centos-swap swap                    swap    defaults        0 0
--重启机器
]# reboot

1

2、安装Kubernetes(kubeadm工具)

  • Kubernetes从1.4版本开始引入了命令行工具kubeadm,致力于简化集群的安装过程,并解决Kubernetes集群的高可用问题。
  • 在Kubernetes 1.13版本中,kubeadm工具进入GA阶段,宣称已经为生产环境应用准备就绪。

2.1、配置yum源(所有节点)

2.1.1、配置docker的yum源

  • 国内常用的两个yum源
    • http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    • https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
]# wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -P /etc/yum.repos.d/

2.1.2、配置kubernetes的yum源

  • 官方yum源的地址
    • https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64。
  • 如果无法访问官方yum源的地址,可以使用国内的yum源
    • http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    • https://mirrors.tuna.tsinghua.edu.cn/kubernetes/yum/repos/kubernetes-el7-x86_64/
]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name= kubernetes CentOS-7
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0

2.2、安装master节点

2.2.1、安装kubeadm和相关工具

--安装应用
]# yum install kubeadm-1.20.14 kubelet-1.20.14 kubectl-1.20.14 docker-ce-20.10.10
--启动docker服务
]# systemctl start docker.service
]# systemctl enable docker.service
--启动kubelet服务
]# systemctl start kubelet.service    --启动失败,因为还没有初始化master节点。执行kubeadm init后,其状态就会恢复正常
]# systemctl enable kubelet.service
  • kubeadm在Master上也安装了kubelet,在默认情况下并不参与工作负载。如果希望安装一个单机All-In-One的Kubernetes环境,则可以执行下面的命令(删除Node的Label“node-role.kubernetes.io/master”),让Master成为一个Node:
kubectl taint nodes --all node-role.kubernetes.io/master

2.2.2、拉取kubernetes各组件的镜像

  • 默认拉取的是k8s.gcr.io上的镜像(国内不能访问该网站)
--列出所需的镜像列表
]# kubeadm config images list
--拉取镜像到本地
]# kubeadm config images pull    --因拉取超时而失败
  • 使用国aliyun的镜像仓库获取镜像
]# kubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers

2.2.3、初始化master节点

  • 注意:kubeadm的安装过程不涉及网络插件(CNI)的初始化,因此kubeadm初步安装完成的集群不具备网络功能,任何Pod包括自带的CoreDNS都无法正常工作。而网络插件的安装往往对kubeadm init命令的参数有一定的要求。例如,安装Calico插件时需要指定--pod-network-cidr=192.168.0.0/16。
]# kubeadm init --kubernetes-version=v1.20.14 --pod-network-cidr=10.10.0.0/16 --service-cidr=10.20.0.0/16 --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
    • --kubernetes-version指定kubernetes的版本号
    • --pod-network-cidr
    • --service-cidr
    • --image-repository指定国内的镜像仓库

2.2.4、初始化后的操作

  • 让用户可以使用kubectl
--如果是普通用户执行以下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

--如果是root用户,执行下面命令
export KUBECONFIG=/etc/kubernetes/admin.conf
  • 保留最后的输出:这是node节点加入集群的凭证,在node上用root用户执行下面的命令就可以加入该集群。
kubeadm join 10.1.1.11:6443 --token ck4388.1w2l2356yv8zu4bk \
    --discovery-token-ca-cert-hash sha256:4af0b74e59514e0a108dceaa65ce941c971ab1ca92207b7ef8b9c9411a5161dc

2.2.5、查看master是否正常

1、查看集群日志

]# journalctl -f -u kubelet
]# tail -50 /var/log/messages

2、显示组件状态信息

]# kubectl get cs    --或kubectl get componentstatus
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS      MESSAGE                                                                                       ERROR
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused   
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused   
etcd-0               Healthy     {"health":"true"}
  • 有两个组件是不正常的(Unhealthy),解决方案如下:
--删除下面两个文件中的“--port=0”
]# vim /etc/kubernetes/manifests/kube-controller-manager.yaml
]# vim /etc/kubernetes/manifests/kube-scheduler.yaml
--重启kubelet
]# systemctl restart kubelet

3、显示各节点状态信息

  • Master为NotReady状态,是因为还没有安装CNI网络插件
]# kubectl get nodes
NAME         STATUS     ROLES                  AGE   VERSION
k8s-master   NotReady   control-plane,master   19m   v1.20.14

2.3、安装node节点

2.3.1、安装kubeadm和相关工具

--安装应用
]# yum install kubeadm-1.20.14 kubelet-1.20.14 docker-ce-20.10.10
--启动docker服务
]# systemctl start docker.service
]# systemctl enable docker.service
--启动kubelet服务
]# systemctl start kubelet.service    ----启动失败,因为还没有加入集群。执行kubeadm join后,其状态就会恢复正常
]# systemctl enable kubelet.service

2.3.2、将node加入集群

--master初始化时输出的凭证信息
]# kubeadm join 10.1.1.11:6443 --token ck4388.1w2l2356yv8zu4bk \
    --discovery-token-ca-cert-hash sha256:4af0b74e59514e0a108dceaa65ce941c971ab1ca92207b7ef8b9c9411a5161dc

2.3.3、在master上参看node信息

  • 各节点状态是NotReady,是因为还没有安装CNI网络插件。
]# kubectl get nodes
NAME         STATUS     ROLES                  AGE    VERSION
k8s-master   NotReady   control-plane,master   39m    v1.20.14
k8s-node01   NotReady                    106s   v1.20.14
k8s-node02   NotReady                    95s    v1.20.14

2.4、安装网络插件

  • CNI网络插件,可以有许多选择,请参考https://kubernetes.io/zh/docs/concepts/cluster-administration/networking/#how-to-implement-the-kubernetes-networking-model的说明。
  • 安装网络插件flannel
    • 官网:https://github.com/flannel-io/flannel
]# wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
]# kubectl apply -f kube-flannel.yml
  • kube-flannel.yml文件
---
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/v1
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/v1
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-plugin
       #image: flannelcni/flannel-cni-plugin:v1.0.1 for ppc64le and mips64le (dockerhub limitations may apply)
        image: rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.1
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
       #image: flannelcni/flannel:v0.16.3 for ppc64le and mips64le (dockerhub limitations may apply)
        image: rancher/mirrored-flannelcni-flannel:v0.16.3
        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: flannelcni/flannel:v0.16.3 for ppc64le and mips64le (dockerhub limitations may apply)
        image: rancher/mirrored-flannelcni-flannel:v0.16.3
        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/
        - name: xtables-lock
          mountPath: /run/xtables.lock
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni-plugin
        hostPath:
          path: /opt/cni/bin
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg
      - name: xtables-lock
        hostPath:
          path: /run/xtables.lock
          type: FileOrCreate
kube-flannel.yml

2.5、验证Kubernetes集群是否安装完成

  • 验证Kubernetes集群的相关Pod是否都正常创建并运行:
]# kubectl get pods --all-namespaces
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   coredns-54d67798b7-tj46k             1/1     Running   0          136m
kube-system   coredns-54d67798b7-zwjpl             1/1     Running   0          136m
kube-system   etcd-k8s-master                      1/1     Running   0          136m
kube-system   kube-apiserver-k8s-master            1/1     Running   0          136m
kube-system   kube-controller-manager-k8s-master   1/1     Running   0          124m
kube-system   kube-flannel-ds-fxflw                1/1     Running   0          19m
kube-system   kube-flannel-ds-l7b2h                1/1     Running   0          19m
kube-system   kube-flannel-ds-pwjk8                1/1     Running   0          19m
kube-system   kube-proxy-8464t                     1/1     Running   0          136m
kube-system   kube-proxy-js9z2                     1/1     Running   0          99m
kube-system   kube-proxy-tcxtb                     1/1     Running   0          98m
kube-system   kube-scheduler-k8s-master            1/1     Running   0          123m
  • 如果发现有状态错误的Pod,则可以执行kubectl --namespace=kubesystem describe pod来查看错误原因,常见的错误原因是镜像没有下载完成。
  • 至此,通过kubeadm工具就实现了Kubernetes集群的快速搭建。如果安装失败,则可以执行kubeadm reset命令将主机恢复原状,重新执行kubeadm init命令,再次进行安装。

3、安装Kubernetes(二进制文件)

3.1、下载Kubernetes二进制文件

  • 从Kubernetes发布官网https://github.com/kubernetes/kubernetes/releases找到对应的版本号,单击CHANGELOG,找到已编译好的二进制文件的下载页面。
    • 在压缩包kubernetes.tar.gz内包含了Kubernetes的服务程序文件、文档和示例;
    • 在压缩包kubernetes-src.tar.gz内则包含了全部源代码。
    • 也可以直接下载Server Binaries中的kubernetes-server-linux-amd64.tar.gz文件,其中包含了Kubernetes需要运行的全部服务程序文件。
  • kubernetes-server-linux-arm64.tar.gz中主要的服务程序文件列表:

#                                                                                                                       #