• centos7 部署kubernetes 1.20.1


    ===============================================

     2021/2/6_第2次修改                       ccb_warlock

     

    更新说明:

    2021/2/6:

    1.增加了3.6,kubernetes端口范围修改的内容

    2.在2.3中,增加了禁用swap讨论的链接地址

    ===============================================

    距离上次接触kubernetes已经是3年前,当时为了给前公司项目的运维集群框架选型而接触了几天,当时还整理了部署手册(https://www.cnblogs.com/straycats/p/8506959.html)。因为当时对linux和docker的了解较少,且公司项目的规模较小,所以最后选择了docker swarm。虽然docker官方也明确表示已经放弃swarm,正在主推kubernetes,但是我仍然觉得小项目用swarm也十分合适,框架的层次和操作逻辑都比kubernetes要简单的多。

     

    目前在做的项目定了以kubernetes作为docker的运维框架,所以我被负责学习和应用基于kubernetes运维demo项目的内容。经过2周的接触,其实kubernetes没我之前感觉的那么难学,从yaml部署的角度来说虽然内容比docker swarm丰富很多,但是很多内容共通。所以有着swarm的知识和经验,学习kubernetes相对来说还较为顺利。本次部署原本想部署1.19.x,但是试验后发现1.19的kube-apiserver的容器始终异常重启,为了节省时间我试验了1.18.x和1.20.1正常后,最后选择用1.20.1作为使用的kubernetes版本。

     

    那么重回kubernetes,还是以部署着手,故先整理部署的内容。我一直认为,做技术一定要踏踏实实,学习并使用别人的东西一定要多动手,会部署是真正会用的第一步。

     

    由于时间所限,暂时没有时间去学习怎么使用多主多从的集群操作,先整理单master(也就是负载也放在同一个服务器的结构)的内容。后续试验了多主多从的操作后,再更新负载节点(node)的内容。该篇较于之前(https://www.cnblogs.com/straycats/p/8506959.html)整理国内有网络的情况下如何部署的内容,不在受限教程提供的离线镜像包,当kubernetes有新版本也可以通过阿里云提供的镜像进行升级(虽然现在通过国内的镜像服务器拉取k8s.io的镜像也较为简单)。

     


    一、部署docker

    可以参考:https://www.cnblogs.com/straycats/p/10680502.html

     


    二、配置服务器

    2.1 设置各个服务器节点的hostname

    # 设置master节点的hostname

    hostnamectl --static set-hostname k8s-master01

    2.2 修改SELinux

    # 将 SELinux 设置为 permissive 模式(相当于将其禁用)

    setenforce 0
    sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

    2.3 关闭swap

    kubernetes官方要求禁用交换分区,也就是常说的虚拟内存。

    国外也对禁用有不同的意见(https://github.com/kubernetes/kubernetes/issues/53533https://medium.com/tailwinds-navigator/kubernetes-tip-why-disable-swap-on-linux-3505f0250263),就像前公司买过阿里云ECS,结果windows的虚拟内存是默认禁用一样,本质希望完全使用内存来提高运行效率,但是当资源不够时反而会适得其反。

    虽然有很多争议,但是为了运行正常还是按官方的要求禁用。

     

    # 当前临时关闭虚拟内存

    swapoff -a

    # 修改/etc/fstab文件

    vi /etc/fstab

    注释掉swap的自动挂载,wq保存。

    #/dev/mapper/centos-swap swap swap defaults 0 0

    # 查看内存使用情况

    free -m

    2.4 配置k8s的路由参数(防止kubeadm报路由警告)

    centos7上的某些用户报告了由于iptables被绕过而导致流量被错误路由的问题。你应该确保net.bridge.bridge-nf-call-iptables在你的sysctl配置中设置为1。试验下来即使是firewalld的也要修改配置。

     

    # 创建一个新的配置文件

    cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF

    # 加载配置

    sysctl --system

    三、部署Master节点

    3.1 安装kubeadm、kubectl、kubelet

    kubernetes官方文档提供的是国外的镜像源,如下:

    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOF

    # 因为不可描述的原因国内无法使用,可以选择阿里云的yum源来解决这个问题

    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

    接着根据官方的说明(https://v1-19.docs.kubernetes.io/zh/docs/setup/release/version-skew-policy/),选择合适版本的组件进行安装。

    # 可以用下面的命令查看可以安装的版本

    yum list kubeadm --showduplicates | sort -r

    # 安装

    yum install -y kubelet-1.20.1-0 kubeadm-1.20.1-0 kubectl-1.20.1-0 --disableexcludes=kubernetes

    # 启动开机启动kubelet

    systemctl start kubelet
    systemctl enable kubelet

    3.2 初始化集群

    通过  kubeadm config images list 可以查看部署服务所需要用的镜像以及版本信息。

     

    # 创建集群

    kubeadm init 
      --kubernetes-version=v1.20.1 
      --pod-network-cidr=10.244.0.0/16 
      --image-repository registry.aliyuncs.com/google_containers 
      --apiserver-advertise-address 192.168.3.89 
      --v=6

    参数说明:

    kubernetes-version:要安装的版本

    pod-network-cidr:负载容器的子网网段

    image-repository:指定镜像仓库(由于从阿里云拉镜像,解决了k8s.gcr.io镜像拉不下来的问题)

    apiserver-advertise-address:节点绑定的服务器ip(多网卡可以用这个参数指定ip)

    v=6:这个参数我还没具体查文档,用法是初始化过程显示详细内容,部署过程如果有问题看详细信息很多时候能找到问题所在

    # 接着根据提示拷贝admin.config的内容到当前用户的$HOME/.kube/config中并授权(为了使当前用户使用kubelet操作服务器)

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

    上图中的token信息要记得保留,新节点加入该集群需要使用。如果忘记了,可以在master节点上通过 kubeadm token list 得到token,默认24小时后过期。

    token过期后,新节点要加入该集群,需要在master节点上用下面的命令重新生成token。

    kubeadm token create

    PS. 如果本地没有导入k8s.gcr.io的镜像或没有配置国内的镜像库,会导致卡在“[init] This might take a minute or longer if the control plane images have to be pulled.”,这时候就要先退出重置后,再初始化。

    # 用下面的命令重置集群

    kubeadm reset

    # 删除/root/.kube目录

    rm -rf $HOME/.kube

    3.3 查看版本

    kubectl version

    3.4 安装flannel

    刚部署完节点状态还不是Ready,需要安装通信组件,常用有flannel和calico,这里选择flannel。

    # 创建目录

    mkdir -p /opt/yaml

    # 编辑kube-flannel.yaml

    vi /opt/yaml/kube-flannel.yaml

    获取部署flannel的yaml文件(https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml)到/opt/yaml目录中,由于不可描述的原因国内访问不了,我这里贴下2021.1获取的内容。

    ---
    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-rc1
            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-rc1
            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

    # 将quay.io换成quay.mirrors.ustc.edu.cn(中科大)的镜像

    sed -i 's#quay.io/coreos/flannel#quay.mirrors.ustc.edu.cn/coreos/flannel#' /opt/yaml/kube-flannel.yaml

    # 部署flannel

    kubectl apply -f /opt/yaml/kube-flannel.yaml

    再查看节点可以看到已经是ready了。

    3.5 单节点集群

    如果是部署单节点集群(需要master节点也当作node节点负载应用),可以执行下面的命令将所有节点都去除污点标签(node-role.kubernetes.io/master-)

    kubectl taint nodes --all node-role.kubernetes.io/master-

    如果需要恢复该节点(k8s-master01)为master only,可以添加污点标签

    kubectl taint node k8s-master01 node-role.kubernetes.io/master=""

    3.6 修改kube-apiserver的端口范围

    kubernetes默认的端口范围:30000 - 32768,如果使用默认配置,则无法与这个范围以外的宿主机端口做映射,可以通过以下操作来修改端口范围。

    # 编辑kube-apiserver配置文件

    vi /etc/kubernetes/manifests/kube-apiserver.yaml

    如下,在command.kube-apiserver中增加service-node-port-range项,wq保存。

    - command:
        - kube-apiserver
        - --service-node-port-range=1-65535 

    接着删除kube-apiserver的pod即可(kubernetes会创建新pod),因为我这宿主机的hostname设置为了k8s-master01,故我使用下面的命令删除:

    kubectl delete pod kube-apiserver-k8s-master01 -n kube-system

    四、部署Node节点

    以后补上。


    参考资料:

    1.https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

    2.https://www.jianshu.com/p/25c01cae990c

    3.https://blog.csdn.net/zhaoydzhaoyd/article/details/111141273

    4.https://blog.csdn.net/qq_41475058/article/details/88849291

    5.https://www.jianshu.com/p/63f7f5c021e4

    6.http://cache.baiducontent.com/c?m=KeduTYlzKX0XQ2-_aMR5i3qBhCnaxW1U9Xxi3TnYu-kgfpuAtK8HgEyhm5uvYQ3Kx6kJGXJAAeiwd6u5nXW1wwxeRW-HOorPoGwoJ3XI23m4ULhCrHNzCzCmcAfyT567f18ChYtDGZO8psJeb-ouixphBvgkmssnVHQTHrGLVC9dkQ6RNC-aCb_cx-x8GXb5OJ4IMfpUGBUMxJuomhDWD_&p=91759a45d68b00e42abe9b7c5353&newp=817ec54ad6c352eb02a9c7710f5492695c02dc3051d3da01298ffe0cc4241a1a1a3aecbb24241502d9c478610abb0f31aba7747d605f76a4df92cc&s=28dd2c7955ce9264&user=baidu&fm=sc&query=kubelet+%CE%AA%CA%B2%C3%B4%BD%FB%D3%C3%BD%BB%BB%BB%B7%D6%C7%F8&qid=d11469a5000d21d3&p1=20

     

     

     

  • 相关阅读:
    边缘检测(13)
    图像梯度
    高斯金字塔和拉普拉斯金字塔(十一)
    轮廓发现(16)
    圆检测(15)
    直线检测(14)
    图像腐蚀与图像膨胀(18)
    go语言从例子开始之Example18_1.结构体中定义方法
    go语言从例子开始之Example18.struct结构体
    go语言从例子开始之Example17.指针
  • 原文地址:https://www.cnblogs.com/straycats/p/14322995.html
Copyright © 2020-2023  润新知