• K8S云计算系列-(3)


    K8S Kubeadm案例实战

    Kubeadm 是一个K8S部署工具,它提供了kubeadm init 以及 kubeadm join 这两个命令来快速创建kubernetes集群

    Kubeadm 通过执行必要的操作来启动和运行一个最小可用的集群。它故意被设计为只关心启动集群,而不是之前的节点准备工作。同样的诸如安装各种各样值得拥有的插件,例如Kubernetes Dashboard、监控解决方案以及特定云提供商的插件,这些都不在它负责的范围。

    相反我们期望由一个基于 kubeadm 从更高层设计的更加合适的工具来做这些事情;并且,理想情况下,使用 kubeadm 作为所有部署的基础将会使得创建一个符合期望的集群变得容易。

    Kubeadm:用于初始化K8S Cluster的工具,会用到Kubelet组件服务,运行在Cluster所有节点上,负责调用Docker指令,启动POD和容器。kubectl:kubectl是kubenetes命令行工具,通过Kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件。

    在机器上手动安装 docker、kubeadm、kubelet、kubectl 几个二进制文件,然后才能再容器化部署其他 Kubernetes 组件。主要通过kubeadm init初始化,初始化K8S集群的流程如下:

    • 检查工作(Preflight Checks):检查Linux内核版本、Cgroups模块可用性、组件版本、端口占用情况、Docker等依赖情况;
    • 生成对外提供服务的CA证书及对应的目录;
    • 生成其他组件访问 kube-apiserver 所需的配置文件;
    • 为Master组件生成应用容器的配置文件,利用这些配置文件,通过Kubernetes 中特殊的容器启动方法:“Static Pod”(Kubeadm init-Kubelet启动时自动加载固定目录的 Pod YAML 文件并启动)-Docker引擎-启动kube-apiserver、kube-controller-manager、kube-scheduler 三个 Master 组件。同时还会生成 Etcd 的 Pod YAML 文件;
    • 为集群生成一个Bootstrap token,其他节点加入集群的机器和 Apiserver打交道,需要获取相应的证书文件,所以Bootstrap token需要扮演安全验证的角色;
    • 安装默认插件,例如:Kube-proxy 和Core DNS,分别提供集群的服务发现和 DNS 功能。
      在这里插入图片描述
      1)安装Kubeadm工具
    
    #安装Kubeadm;
    yum install -y kubeadm-1.20.4 kubelet-1.20.4 kubectl-1.20.4
    #启动kubelet服务
    systemctl enable kubelet.service
    systemctl start kubelet.service
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2)Kubeadm常见指令操作;

    
    kubeadm init 启动一个 Kubernetes 主节点
    kubeadm join 启动一个 Kubernetes 工作节点并且将其加入到集群
    kubeadm upgrade 更新一个 Kubernetes 集群到新版本
    kubeadm config 如果使用 v1.7.x 或者更低版本的 kubeadm 初始化集群,您需要对集群做一些配置以便使用 kubeadm upgrade 命令
    kubeadm token 管理 kubeadm join 使用的令牌
    kubeadm reset 还原 kubeadm init 或者 kubeadm join 对主机所做的任何更改
    kubeadm version 打印 kubeadm 版本
    kubeadm alpha 预览一组可用的新功能以便从社区搜集反馈
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    K8S Master节点实战

    1)执行kubeadm init初始化安装Master相关软件;

    kubeadm init --control-plane-endpoint=192.168.1.146:6443 --image-repository registry.aliyuncs.com/google_containers   --kubernetes-version v1.20.4 --service-cidr=10.10.0.0/16   --pod-network-cidr=10.244.0.0/16   --upload-certs
    
    • 1

    2)根据如上指令操作,执行成功,如图所示:
    在这里插入图片描述

    在这里插入图片描述
    3)根据如上图提示,接下来需手工执行如下指令,拷贝admin配置文件;

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

    4)将node节点加入K8S集群,在Node节点使用的参数和指令如下;

    
    kubeadm join 192.168.1.146:6443 --token ze0zfe.9zhew67l6gxsq7du \
        --discovery-token-ca-cert-hash sha256:ee5a3f9accf98c76a3a3da1f3c4540c14c9e9ce49a4070de4b832aa8cb3a8f31
    
    • 1
    • 2
    • 3

    Node1节点加入集群

    #启动Node1节点上docker引擎服务;
    systemctl start docker.service
    #将Node1节点加入K8S集群;
    kubeadm join 192.168.1.146:6443 --token ze0zfe.9zhew67l6gxsq7du \
    --discovery-token-ca-cert-hash sha256:ee5a3f9accf98c76a3a3da1f3c4540c14c9e9ce49a4070de4b832aa8cb3a8f31
    #执行kubeadm init时没有记录下加入集群的指令,可以通过以下命令重新创建即可;
    kubeadm token create --print-join-command
    #登录K8S Master节点验证节点信息;
    kubectl get nodes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    K8S节点网络配置

    Kubernetes整个集群所有服务器(Master、Minions)配置Flanneld,操作方法和指令如下:
    参考:https://github.com/containernetworking/cni
    必须安装pod网络插件,以便pod之间可以相互通信,必须在任何应用程序之前部署网络,CoreDNS不会在安装网络插件之前启动。
    1)安装Flanneld网络插件;
    Fanneld定义POD的网段为: 10.244.0.0/16,POD容器的IP地址会自动分配10.244开头的网段IP。安装Flanneld网络插件指令如下:

    #下载Fanneld插件YML文件;
    yum install wget -y
    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    #提前下载Flanneld组建所需镜像;
    for i in $(cat kube-flannel.yml |grep image|awk -F: '{print $2":"$3}'|uniq );do docker pull $i ;done
    #应用YML文件;
    kubectl apply -f kube-flannel.yml
    #查看Flanneld网络组建是否部署成功;
    kubectl -n kube-system get pods|grep -aiE flannel
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Kube-flannel.yaml配置文件代码如:

    ---
    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
            image: quay.io/coreos/flannel:v0.13.1-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.1-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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223

    在这里插入图片描述
    2)安装Calico网络插件;
    官方文档参考:
    https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network
    https://docs.projectcalico.org/v3.10/getting-started/kubernetes/
    为使calico正常工作,你需要传递–pod-network-cidr=10.10.0.0/16到kubeadm init或更新calico.yml文件,以与您的pod网络相匹配。

    kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml
    
    • 1

    在这里插入图片描述
    如果安装flannel网络插件,必须通过kubeadm init配置–pod-network-cidr=10.10.0.0/16参数。
    验证网络插件
    安装了pod网络后,确认coredns以及其他pod全部运行正常,查看master节点状态为Ready
    kubectl get nodes
    kubectl -n kube-system get pods

    在这里插入图片描述
    至此,Kubernetes 的 Master 节点就部署完成了。如果只需要一个单节点的 Kubernetes,现在你就可以使用了。

  • 相关阅读:
    库克建议想要侧载的用户购买安卓手机,苹果这是飘了?
    【Python刷题篇】Python从0到入门4|字典复习、函数入门、综合实践
    rust多个mod文件引用和文件夹mod使用注意事项
    91话费接口API优惠充值源码分享
    oracle递归with子句
    figma有哪些快速入门的好用技巧
    ZooKeeper 之zkCli.sh 客户端一文读懂
    CS144 计算机网络 Lab0:Networking Warmup
    2:Alibaba微服务组件Nacos注册中心
    [附源码]计算机毕业设计springboot现代诗歌交流平台
  • 原文地址:https://blog.csdn.net/weixin_44681349/article/details/133776563