• Centos7.9 安装k8s集群 全过程


    • 一、系统环境配置  (所有节点操作)
    1. 关闭防火墙 

      #关闭selinux、防火墙
      systemctl stop firewalld.service
      systemctl disable firewalld.service
      firewall-cmd --state
      sed -i '/^SELINUX=.*/c SELINUX=disabled' /etc/selinux/config
      sed -i 's/^SELINUXTYPE=.*/SELINUXTYPE=disabled/g' /etc/selinux/config
      grep --color=auto '^SELINUX' /etc/selinux/config
      setenforce 0
    2. 禁用swap 
      sed -i.bak '/swap/s/^/#/' /etc/fstab
    3. 时间同步 

      yun install -y ntp
      
      /usr/sbin/ntpdate ntp6.aliyun.com 
      echo "*/3 * * * * /usr/sbin/ntpdate ntp6.aliyun.com  &> /dev/null" > /tmp/crontab
      crontab /tmp/crontab
    4. 设置host映射和主机名
      #(自己根据节点名称起名)
      hostnamectl set-hostname master
      
      cat >> /etc/hosts << EOF
      192.168.0.174   master
      192.168.0.175   node1
      192.168.0.176   node2
      EOF
    5. 内核参数修改
      cat <<EOF > /etc/sysctl.d/k8s.conf
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1
      EOF
    6. 设置k8s源
      cat <<EOF > /etc/yum.repos.d/kubernetes.repo
      [kubernetes]
      name=Kubernetes
      baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
      enabled=1
      gpgcheck=1
      repo_gpgcheck=1
      gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
      EOF
    7. 设置docker源
      #1.安装依赖包
       yum install -y yum-utils device-mapper-persistent-data lvm2
      #2.设置docker国内源
       yum-config-manager 
       --add-repo 
       http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

       #更新源
        yum clean all
        yum -y makecache

      
      

        #关机重启
        reboot

       
    • 二、安装docker (所有节点操作)
      docker版本查看
      yum list docker-ce --showduplicates | sort -r
       #安装19版本的docker
      yum install -y docker-ce-19.03.13 docker-ce-cli-19.03.13 containerd.io
      
      
      #启动docker 并设置开机启动
      systemctl start docker && systemctl enable docker
      
      #补全docker命令
      yum -y install bash-completion
      source /etc/profile.d/bash_completion.sh
      
      
      #镜像加速
      mkdir -p /etc/docker
      
      cat >> /etc/docker/daemon.json << EOF
      {
        "registry-mirrors": ["https://23h04een.mirror.aliyuncs.com"],
        "exec-opts": ["native.cgroupdriver=systemd"]
      }
      EOF
      
      
      #重新加载服务
      systemctl daemon-reload && systemctl restart docker
      
      #验证
      docker --version
    • 三、k8s安装(所有节点操作)
      1.版本查看
      yum list kubelet --showduplicates | sort -r
      
      #安装
      yum install -y kubelet-1.19.8 kubeadm-1.19.8 kubectl-1.19.8
      #安装包说明
      #kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
      #kubeadm 用于初始化集群,启动集群的命令工具
      #kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
      
      #启动kubelet并设置开机启动
      systemctl enable kubelet && systemctl start kubelet
      
      #kubectl命令补全
      echo "source <(kubectl completion bash)" >> ~/.bash_profile
      source .bash_profile
      
      
      
      #检查是否报错
      systemctl status kubelet
      
      #下载镜像
      vim image.sh
      
      #!/bin/bash
      url=registry.cn-hangzhou.aliyuncs.com/google_containers
      version=v1.19.8
      images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
      for imagename in ${images[@]} ; do
        docker pull $url/$imagename
        docker tag $url/$imagename k8s.gcr.io/$imagename
        docker rmi -f $url/$imagename
      done
      
      
      #设置可执行权限
      chmod +x ./image.sh
      ./image.sh
      
      
      #查看下载后的镜像
      docker images​ list

      
      
      
       
    • 四、集群初始化(master节点操作)
    1. master集群初始化
      kubeadm init --apiserver-advertise-address=192.168.0.174 --kubernetes-version v1.19.8 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
      
      #apiserver-advertise-address指定master的interface,pod-network-cidr指定Pod网络的范围,这里使用flannel网络方案。
      #记录kubeadm join的输出,后面需要这个命令将各个节点加入集群中
      
      
      
      #健康检查
      kubectl get cs
      
      #查看是否所有的pod都处于running状态
      kubectl get pod -n kube-system -o wide
      
      
      
      
      
      
      ##如果失败,就重来
      kubeadm reset
      rm -rf $HOME/.kube/config​
    2. 加载环境变量
      echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
      source .bash_profile
      
      #如果以上操作不是root用户,则需要执行
      mkdir -p $HOME/.kube
      cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      chown $(id -u):$(id -g) $HOME/.kube/config
    3. 安装flannel网络
      cat >> kube-flannel.yml << EOF
      ---
      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: jmgao1983/flannel #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: jmgao1983/flannel #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
      
      
      EOF
      View Code
      #执行刚才创建文件
      kubectl apply -f kube-flannel.yml 
      
      
      #查看是否创建完成,否则下一步的加入节点无法成功
      kubectl get pod --all-namespaces
      
      #如果一直处于init中,说明下载镜像超时,手动使用docker下载flannel镜像
      #kubectl delete -f kube-flannel.yml
      
      #kubectl get pod -n kube-system -o wide
      
      #docker search  flannel
      
      #下载第一个,使用stars多的
      #docker pull jmgao1983/flannel
      
      #kubectl apply -f kube-flannel.yml
       
      #查看状态,所有的都running之后,加入其它2个节点到集群中
      kubectl get pod -n kube-system -o wide
    • 五、其它节点加入集群(node节点操作)
      kubeadm join 192.168.0.174:6443 --token 1cn9zk.wgzlc9b77dpwvfvy     --discovery-token-ca-cert-hash sha256:39912451e0519cbcb2d59c836dda9c210e6262698da30c9cac6f14a25b0bf308
      #令牌查看
      #kubeadm token list
      
      #如果过期,生成新的令牌
      #kubeadm token create
      
      #生成新的加密串
      #openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | 
      #openssl dgst -sha256 -hex | sed 's/^.* //'
    • 六、安装Dashboard(master节点操作)
    1. 编辑生成recommended.yaml文件
      cat >> recommended.yaml << EOF
      # Copyright 2017 The Kubernetes Authors.
      #
      # Licensed under the Apache License, Version 2.0 (the "License");
      # you may not use this file except in compliance with the License.
      # You may obtain a copy of the License at
      #
      #     http://www.apache.org/licenses/LICENSE-2.0
      #
      # Unless required by applicable law or agreed to in writing, software
      # distributed under the License is distributed on an "AS IS" BASIS,
      # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      # See the License for the specific language governing permissions and
      # limitations under the License.
      
      apiVersion: v1
      kind: Namespace
      metadata:
        name: kubernetes-dashboard
      
      ---
      
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        labels:
          k8s-app: kubernetes-dashboard
        name: kubernetes-dashboard
        namespace: kubernetes-dashboard
      
      ---
      
      kind: Service
      apiVersion: v1
      metadata:
        labels:
          k8s-app: kubernetes-dashboard
        name: kubernetes-dashboard
        namespace: kubernetes-dashboard
      spec:
        ports:
          - port: 443
            targetPort: 8443
        selector:
          k8s-app: kubernetes-dashboard
      
      ---
      
      kind: Service
      apiVersion: v1
      metadata:
        labels:
          k8s-app: kubernetes-dashboard
        name: kubernetes-dashboard
        namespace: kubernetes-dashboard
      spec:
        type: NodePort
        ports:
          - port: 443
            targetPort: 8443
            nodePort: 31443
        selector:
          k8s-app: kubernetes-dashboard
      
      ---
      
      apiVersion: v1
      kind: Secret
      metadata:
        labels:
          k8s-app: kubernetes-dashboard
        name: kubernetes-dashboard-certs
        namespace: kubernetes-dashboard
      type: Opaque
      
      ---
      
      apiVersion: v1
      kind: Secret
      metadata:
        labels:
          k8s-app: kubernetes-dashboard
        name: kubernetes-dashboard-csrf
        namespace: kubernetes-dashboard
      type: Opaque
      data:
        csrf: ""
      
      ---
      
      apiVersion: v1
      kind: Secret
      metadata:
        labels:
          k8s-app: kubernetes-dashboard
        name: kubernetes-dashboard-key-holder
        namespace: kubernetes-dashboard
      type: Opaque
      
      ---
      
      kind: ConfigMap
      apiVersion: v1
      metadata:
        labels:
          k8s-app: kubernetes-dashboard
        name: kubernetes-dashboard-settings
        namespace: kubernetes-dashboard
      
      ---
      
      kind: Role
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
        labels:
          k8s-app: kubernetes-dashboard
        name: kubernetes-dashboard
        namespace: kubernetes-dashboard
      rules:
        # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
        - apiGroups: [""]
          resources: ["secrets"]
          resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
          verbs: ["get", "update", "delete"]
          # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
        - apiGroups: [""]
          resources: ["configmaps"]
          resourceNames: ["kubernetes-dashboard-settings"]
          verbs: ["get", "update"]
          # Allow Dashboard to get metrics.
        - apiGroups: [""]
          resources: ["services"]
          resourceNames: ["heapster", "dashboard-metrics-scraper"]
          verbs: ["proxy"]
        - apiGroups: [""]
          resources: ["services/proxy"]
          resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]
          verbs: ["get"]
      
      ---
      
      kind: ClusterRole
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
        labels:
          k8s-app: kubernetes-dashboard
        name: kubernetes-dashboard
      rules:
        # Allow Metrics Scraper to get metrics from the Metrics server
        - apiGroups: ["metrics.k8s.io"]
          resources: ["pods", "nodes"]
          verbs: ["get", "list", "watch"]
      
      ---
      
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        labels:
          k8s-app: kubernetes-dashboard
        name: kubernetes-dashboard
        namespace: kubernetes-dashboard
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: Role
        name: kubernetes-dashboard
      subjects:
        - kind: ServiceAccount
          name: kubernetes-dashboard
          namespace: kubernetes-dashboard
      
      ---
      
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: kubernetes-dashboard
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: kubernetes-dashboard
      subjects:
        - kind: ServiceAccount
          name: kubernetes-dashboard
          namespace: kubernetes-dashboard
      
      ---
      
      kind: Deployment
      apiVersion: apps/v1
      metadata:
        labels:
          k8s-app: kubernetes-dashboard
        name: kubernetes-dashboard
        namespace: kubernetes-dashboard
      spec:
        replicas: 1
        revisionHistoryLimit: 10
        selector:
          matchLabels:
            k8s-app: kubernetes-dashboard
        template:
          metadata:
            labels:
              k8s-app: kubernetes-dashboard
          spec:
            containers:
              - name: kubernetes-dashboard
                image: kubernetesui/dashboard:v2.3.1
                imagePullPolicy: Always
                ports:
                  - containerPort: 8443
                    protocol: TCP
                args:
                  - --auto-generate-certificates
                  - --namespace=kubernetes-dashboard
                  # Uncomment the following line to manually specify Kubernetes API server Host
                  # If not specified, Dashboard will attempt to auto discover the API server and connect
                  # to it. Uncomment only if the default does not work.
                  # - --apiserver-host=http://my-address:port
                volumeMounts:
                  - name: kubernetes-dashboard-certs
                    mountPath: /certs
                    # Create on-disk volume to store exec logs
                  - mountPath: /tmp
                    name: tmp-volume
                livenessProbe:
                  httpGet:
                    scheme: HTTPS
                    path: /
                    port: 8443
                  initialDelaySeconds: 30
                  timeoutSeconds: 30
                securityContext:
                  allowPrivilegeEscalation: false
                  readOnlyRootFilesystem: true
                  runAsUser: 1001
                  runAsGroup: 2001
            volumes:
              - name: kubernetes-dashboard-certs
                secret:
                  secretName: kubernetes-dashboard-certs
              - name: tmp-volume
                emptyDir: {}
            serviceAccountName: kubernetes-dashboard
            nodeSelector:
              "kubernetes.io/os": linux
            # Comment the following tolerations if Dashboard must not be deployed on master
            tolerations:
              - key: node-role.kubernetes.io/master
                effect: NoSchedule
      
      ---
      
      kind: Service
      apiVersion: v1
      metadata:
        labels:
          k8s-app: dashboard-metrics-scraper
        name: dashboard-metrics-scraper
        namespace: kubernetes-dashboard
      spec:
        ports:
          - port: 8000
            targetPort: 8000
        selector:
          k8s-app: dashboard-metrics-scraper
      
      ---
      
      kind: Deployment
      apiVersion: apps/v1
      metadata:
        labels:
          k8s-app: dashboard-metrics-scraper
        name: dashboard-metrics-scraper
        namespace: kubernetes-dashboard
      spec:
        replicas: 1
        revisionHistoryLimit: 10
        selector:
          matchLabels:
            k8s-app: dashboard-metrics-scraper
        template:
          metadata:
            labels:
              k8s-app: dashboard-metrics-scraper
            annotations:
              seccomp.security.alpha.kubernetes.io/pod: 'runtime/default'
          spec:
            containers:
              - name: dashboard-metrics-scraper
                image: kubernetesui/metrics-scraper:v1.0.6
                ports:
                  - containerPort: 8000
                    protocol: TCP
                livenessProbe:
                  httpGet:
                    scheme: HTTP
                    path: /
                    port: 8000
                  initialDelaySeconds: 30
                  timeoutSeconds: 30
                volumeMounts:
                - mountPath: /tmp
                  name: tmp-volume
                securityContext:
                  allowPrivilegeEscalation: false
                  readOnlyRootFilesystem: true
                  runAsUser: 1001
                  runAsGroup: 2001
            serviceAccountName: kubernetes-dashboard
            nodeSelector:
              "kubernetes.io/os": linux
            # Comment the following tolerations if Dashboard must not be deployed on master
            tolerations:
              - key: node-role.kubernetes.io/master
                effect: NoSchedule
            volumes:
              - name: tmp-volume
                emptyDir: {}
      
      
      EOF
      View Code
      # 创建 pod
      kubectl apply -f recommended.yaml
      
      kubectl get svc --all-namespaces
      
      
      
      #获取token
      kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
      
      #浏览器访问
      https://192.168.0.174:31443
      
      #输入token
      
      
      
       
  • 相关阅读:
    最快的进程间通信方式你get了么
    【Java】简易Socket连接实现
    【Java】基于RXTX的Java串口通信
    【Android】WebDav For Android
    【Java】Swing实现一个简单的计算器
    (未完成)【Android】MVP模式初见(一)
    【编译原理】TEST递归下降演示
    【Android】LitePal的基础
    【Flutter】Demo1一个名字生成器
    【Flutter】环境搭建以及HelloWorld创建
  • 原文地址:https://www.cnblogs.com/fang888/p/15379313.html
Copyright © 2020-2023  润新知