ARM64手动安装kubernetes(无证书)

0.准备工作


  • 这次的安装部署是在arm64上面执行的,板子为RK3328,系统为Ubuntu16.04。

    主要有一个Master和两个Node,主要需要安装以下的组件:

角色 IP 组件
k8s-master 172.16.32.10 etcd,apiserver,controller-manager,scheduler,flannel
k8s-node1 172.16.32.11 kubelet,kube-proxy,flannel,docker
k8s-node2 172.16.32.12 kubelet,kube-proxy,flannel,docker

这里Master的组件是:kube-apiserver,kube-controller-manager,kube-scheduler

  • 提前下载好相关的组件

    • etcd-v3.3.5-linux-arm64.tar.gz
    • flannel-v0.10.0-linux-arm64.tar.gz
    • kubernetes-node-linux-arm64.tar.gz
    • kubernetes-server-linux-arm64.tar.gz

    具体下载到GitHub上下载,如果不知道网址,可以直接搜 xxx release(比如etcd release),一般出来第一个就是了,然后选择对应版本下载

1.部署Master


  1. 部署前的初始化

    • 首先以root用户执行以下动作

      1. 关闭防火墙ufw disable

      2. 安装ntp(如果没有安装) sudo apt-get install ntp

      3. 添加主机名和IP到/etc/hosts

        172.16.32.10 k8s-master
        172.16.32.11 k8s-node1
        172.16.32.12 k8s-node2
        
      4. 新建一个k8s-master用户,并且赋予root权限

        useradd -m -d /home/k8s-master -s /bin/bash k8s-master
         sudo sed -i -r '/root.*ALL=\(ALL.*ALL/a   \k8s-master  ALL=\(ALL\) NOPASSWD: ALL' /etc/sudoers
        
      5. 切换到k8s-master用户 su k8s-master

    • 切换到k8s-master用户执行以下动作

      1. 创建文件夹,用来保存bin和组件的配置文件

        sudo mkdir -p ~/kubernetes/bin && sudo mkdir ~/kubernetes/cfg

      2. 设置环境变量,因为我们的二进制放在自己指定的路径,加入环境变量就方便使用。

        echo "export PATH=\$PATH:/home/k8s-master/kubernetes/bin" >> ~/.bashrc

        source ~/.bashrc

  2. 安装ETCD

    • 解压etcd-v3.3.5-linux-arm64.tar.gz

      sudo tar -zxvf etcd-v3.3.5-linux-arm64.tar.gz

    • 复制解压目录下的etcd,etcdctl到~/kubernetes/bin

      sudo cp etcd-v3.3.5-linux-arm64/etcd* ~/kubernetes/bin

    • 创建etcd配置文件 sudo vi ~/kubernetes/cfg/ectd.cfg

      ETCD_NAME="default"
      ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
      ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
      ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
      

      注意这里在启动etcd服务之前,需要先创建好/var/lib/etcd目录,存放etcd的数据

    • 创建etcd服务文件 sudo vi /lib/systemd/system/etcd.service

      [Unit]
      Description=Etcd Server
      After=network.target
      
      [Service]
      Type=simple
      WorkingDirectory=/var/lib/etcd
      Environment=ETCD_UNSUPPORTED_ARCH=arm64
      EnvironmentFile=-/home/k8s-master/kubernetes/cfg/etcd.conf
      # set GOMAXPROCS to number of processors
      ExecStart=/bin/bash -c "GOMAXPROCS=\$(nproc) /home/k8s-master/kubernetes/bin/etcd"
      Type=notify
      
      [Install]
      WantedBy=multi-user.target
      

      注意,这里需要加上一句Environment=ETCD_UNSUPPORTED_ARCH=arm64,因为当前etcd要支持arm必须这样子,否则etcd无法启动。

    • 启动ETCD服务

      sudo systemctl daemon-reload
      sudo systemctl start etcd
      sudo systemctl enable etcd
      

      可以通过systemctl status etcd 查看ETCD的状态,如果出错,可以看log日志:/var/log/syslog

    • 创建ETCD网络

      etcdctl set /coreos.com/network/config "{\"Network\":\"10.1.0.0/16\",\" Backend \"{\"Type\":\"vxlan\"}}"

      如果不指定Backend类型为vxlan,在安装flannel时会报错:不支持UDP Backend,因为flannel默认Backend是UDP,arm不支持,所以在创建ETCD网络的时候需要指定Backend类型

  3. 安装Master三个重要组件:kube-apiserver,kube-controller-manager,kube-scheduler

    • 解压kubernetes-server-linux-arm64.tar.gz

      sudo tar -zxvf kubernetes-server-linux-arm64.tar.gz -C kubernetes-server-linux-arm64

    • 复制二进制bin文件到 ~/kubernetes/bin

      sudo cp kubernetes-server-linux-arm64/kubernetes/server/bin/kube-apiserver ~/kubernetes/bin

      sudo cp kubernetes-server-linux-arm64/kubernetes/server/bin/kube-controller-manager ~/kubernetes/bin

      sudo cp kubernetes-server-linux-arm64/kubernetes/server/bin/kube-scheduler ~/kubernetes/bin

    • 安装kube-apiserver

      • 添加kube-apisever配置文件

        sudo vi ~/kubernetes/cfg/kube-apiserver

        # --logtostderr=true: log to standard error instead of files
        KUBE_LOGTOSTDERR="--logtostderr=true"
        
        # --v=0: log level for V logs
        KUBE_LOG_LEVEL="--v=4"
        
        # --etcd-servers=[]: List of etcd servers to watch (http://ip:port),
        # comma separated. Mutually exclusive with -etcd-config
        KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
        
        # --insecure-bind-address=127.0.0.1: The IP address on which to serve the --insecure-port.
        KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
        
        # --insecure-port=8080: The port on which to serve unsecured, unauthenticated access.
        KUBE_API_PORT="--insecure-port=8080"
        
        # --allow-privileged=false: If true, allow privileged containers.
        KUBE_ALLOW_PRIV="--allow-privileged=false"
        
        # --service-cluster-ip-range=<nil>: A CIDR notation IP range from which to assign service cluster IPs.
        # This must not overlap with any IP ranges assigned to nodes for pods.
        KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=169.169.0.0/16"
        
        # --admission-control="AlwaysAdmit": Ordered list of plug-ins
        # to do admission control of resources into cluster.
        # Comma-delimited list of:
        #   LimitRanger, AlwaysDeny, SecurityContextDeny, NamespaceExists,
        #   NamespaceLifecycle, NamespaceAutoProvision, AlwaysAdmit,
        #   ServiceAccount, DefaultStorageClass, DefaultTolerationSeconds, ResourceQuota
        KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ResourceQuota"
        
      • 添加api-server服务文件

        sudo vi /lib/systemd/system/kube-apiserver.service

        [Unit]
        Description=Kubernetes API Server
        Documentation=https://github.com/kubernetes/kubernetes
        
        [Service]
        EnvironmentFile=-/home/k8s-master/kubernetes/cfg/kube-apiserver
        ExecStart=/home/k8s-master/kubernetes/bin/kube-apiserver    
                           ${KUBE_LOGTOSTDERRR}         \
                                ${KUBE_LOG_LEVEL}           \
                                ${KUBE_ETCD_SERVERS}        \
                                ${KUBE_API_ADDRESS}         \
                                ${KUBE_API_PORT}            \
                                ${KUBE_ALLOW_PRIV}          \
                                ${KUBE_SERVICE_ADDRESSES}   \
                                ${KUBE_ADMISSION_CONTROL}
        Restart=on-failure
        
        [Install]
        WantedBy=multi-user.target
        
      • 启动服务

        sudo systemctl daemon-reload
        sudo systemctl start kube-apiserver
        sudo systemctl enable kube-apiserver
        
    • 安装kube-controller-manager

      • 添加配置文件

        sudo vi ~/kubernetes/cfg/kube-controller-manager

        KUBE_LOGTOSTDERR="--logtostderr=true"
        KUBE_LOG_LEVEL="--v=4"
        KUBE_MASTER="--master=172.16.32.10:8080"
        
      • 添加服务文件

        sudo vi /lib/systemd/system/kube-controller-manager.service

        [Unit]
        Description=Kubernetes Controller Manager
        Documentation=https://github.com/kubernetes/kubernetes
        
        [Service]
        EnvironmentFile=-/home/k8s-master/kubernetes/cfg/kube-controller-manager
        ExecStart=/home/k8s-master/kubernetes/bin/kube-controller-manager 
                         ${KUBE_LOOGTOSTDERR} \
                              ${KUBE_LOG_LEVEL}   \
                              ${KUBE_MASTER}
        Restart=on-failure
        
        [Install]
        WantedBy=multi-user.target
        
      • 启动服务

        sudo systemctl daemon-reload
        sudo systemctl strat kube-controller-manager
        sudo systemctl enable kube-controller-manager
        
    • 安装kube-scheduler

      • 添加配置文件

        sudo vi ~/kubernetes/cfg/kube-scheduler

        # --logtostderr=true: log to standard error instead of files
        KUBE_LOGTOSTDERR="--logtostderr=true"
        
        # --v=0: log level for V logs
        KUBE_LOG_LEVEL="--v=4"
        
        KUBE_MASTER="--master=172.16.32.10:8080"
        
      • 添加服务文件

        sudo vi ~/lib/systemd/system/kube-scheduler.service

        [Unit]
        Description=Kubernetes Scheduler
        Documentation=https://github.com/kubernetes/kubernetes
        
        [Service]
        EnvironmentFile=-/home/k8s-master/kubernetes/cfg/kube-scheduler
        ExecStart=/home/$USER_HOME_DIR/kubernetes/bin/kube-scheduler  
                           ${KUBE_LOGTOSTDERRR}     \
                                ${KUBE_LOG_LEVEL}       \
                                ${KUBE_MASTER}
        Restart=on-failure
        
        [Install]
        WantedBy=multi-user.target
        
      • 启动服务

        sudo systemctl daemon-reload
        sudo systemctl start kube-scheduler
        sudo systemctl enable kube-scheduler
        
  4. 安装flannel

    • 解压flannel-v0.10.0-linux-arm64.tar.gz

      sudo tar -zxvf flannel-v0.10.0-linux-arm64.tar.gz -C flannel-v0.10.0-linux-arm64

    • 先复制二进制文件到~/kubernetes/bin

      sudo cp flannel-v0.10.0-linux-arm64/* ~/kubernetes/bin

    • 安装flannel

      • 添加配置文件

        sudo vi ~/kubernetes/cfg/flanneld.conf

        FLANNEL_ETCD_ENDPOINTS="http://172.16.32.10:2379"
        FLANNEL_IFACE="eth0"
        FLANNEL_ETCD_PREFIX="/coreos.com/network"
        FLANNEL_OPTIONS=""
        

        注意,如果有多个网卡,需要指定具体的网卡,要加上FLANNEL_IFACE=xxx选项,在启动时候加上-iface=$(FLANNEL_IFACE)

      • 添加服务文件

        sudo vi /lib/systemd/system/flanneld.service

        [Unit]
        Description=Flanneld
        Documentation=https://github.com/coreos/flannel
        After=network.target
        Before=docker.service
        
        [Service]
        EnvironmentFile=-/home/k8s-master/kubernetes/cfg/flanneld.conf
        ExecStart=/home/k8s-master/kubernetes/bin/flanneld \
                 -etcd-endpoints=\${FLANNEL_ETCD_ENDPOINTS} \
                 -iface=\${FLANNEL_IFACE} \
                 -etcd-prefix=\${FLANNEL_ETCD_PREFIX} \
                 \${FLANNEL_OPTIONS}
        Restart=on-failure
        Type=notify
        LimitNOFILE=65536
        
        [Install]
        WantedBy=multi-user.target
        RequiredBy=docker.service
        
      • 启动服务

        sudo systemctl daemon-reload
        sudo systemctl start flanneld
        sudo systemctl enable flanneld
        
    • 配置docker网络,覆盖docker网络

      sudo cat /run/flannel/subnet.env | grep "FLANNEL_SUBNET" | cut -d= -f2
      # 将结果保存起来(10.1.90.1/24)
      
      #创建文件,写入
      sudo echo "
         [Service]
         ExecStart=
         ExecStart=/usr/bin/dockerd --bip=10.1.90.1/24 --mtu=1472
         " > /etc/systemd/system/docker.service.d/docker.conf
      
      #重启docker
      sudo systemctl daemon-reload
      sudo systemctl start docker
      sudo systemctl enable docker 
      

2.部署Node


Node的部署与Master大致一样,都是添加配置文件,服务文件,启动服务。

  1. 同样在部署前需要做些初始化

    • 关闭防火墙ufw disable

    • 安装ntp(如果没有安装) sudo apt-get install ntp

    • 添加主机名和IP到/etc/hosts

      172.16.32.10 k8s-master
      172.16.32.11 k8s-node1
      172.16.32.12 k8s-node2
      
    • 新建一个k8s-node1用户,并且赋予root权限

      useradd -m -d /home/k8s-node1 -s /bin/bash k8s-node1
      sudo sed -i -r '/root.*ALL=\(ALL.*ALL/a   \k8s-node1  ALL=\(ALL\) NOPASSWD: ALL' /etc/sudoers
      
    • 切换到k8s-node1 su k8s-node1

    • 切换到k8s-node1用户执行以下动作

      • 创建文件夹,用来保存bin和组件的配置文件

        sudo mkdir -p ~/kubernetes/bin && sudo mkdir ~/kubernetes/cfg

  2. 安装kubelet,kube-proxy

    • 解压kubernetes-node-linux-arm64.tar.gz

      sudo tar -zxvf kubernetes-node-linux-arm64.tar.gz kubernetes-node-linux-arm64

    • 复制二进制bin到~/kubernetes/bin

      sudo cp kubernetes-node-linux-arm64/kubernetes/node/bin/kubelet ~/kubernetes/bin

      sudo cp kubernetes-node-linux-arm64/kubernetes/node/bin/kube-proxy ~/kubernetes/bin

    • 安装kubelet

      • 添加配置文件

        sudo vi ~/kubernetes/cfg/kubelet.kubeconfig

        apiVersion: v1
        kind: Config
        clusters:
          - cluster:
              server: http://172.16.32.10:8080/
            name: local
        contexts:
          - context:
              cluster: local
            name: local
        current-context: local
        

        sudo vi ~/kubernetes/cfg/kubelet

        # --logtostderr=true: log to standard error instead of files
        KUBE_LOGTOSTDERR="--logtostderr=true"
        
        #  --v=0: log level for V logs
        KUBE_LOG_LEVEL="--v=4"
        
        # --address=0.0.0.0: The IP address for the Kubelet to serve on (set to 0.0.0.0 for all interfaces)
        NODE_ADDRESS="--address=172.16.32.11"
        
        # --port=10250: The port for the Kubelet to serve on. Note that "kubectl logs" will not work if you set this flag.
        NODE_PORT="--port=10250"
        
        # --hostname-override="": If non-empty, will use this string as identification instead of the actual hostname.
        NODE_HOSTNAME="--hostname-override=ubuntu-node1"
        
        # Path to a kubeconfig file, specifying how to connect to the API server.
        KUBELET_KUBECONFIG="--kubeconfig=~/kubernetes/cfg/kubelet.kubeconfig"
        #KUBELET_KUBECONFIG="--api-servers=http://${MASTER_ADDRESS}:8080"
        
        # --allow-privileged=false: If true, allow containers to request privileged mode. [default=false]
        KUBE_ALLOW_PRIV="--allow-privileged=false"
        
        # DNS info
        KUBELET__DNS_IP="--cluster-dns=169.169.0.2"
        KUBELET_DNS_DOMAIN="--cluster-domain=cluster.local"
        
        KUBELET_SWAP="--fail-swap-on=false"
        
        KUBELET_ARGS="--pod_infra_container_image=hub.c.163.com/allan1991/pause-amd64:3.0"
        

        在kubernetes1.10版本中,KUBELET_KUBECONFIG修改为了用一个yaml的配置文件,而不再是以前的指定--api-server的方式,需要相应更改过来,否则kubelet无法启动。

      • 添加服务文件

        sudo vi /lib/systemd/system/kubelet.service

        [Unit]
        Description=Kubernetes Kubelet
        After=docker.service
        Requires=docker.service
        
        [Service]
        EnvironmentFile=-/home/k8s-node1/kubernetes/cfg/kubelet
        ExecStart=/home/k8s-node1/kubernetes/bin/kubelet       
                       ${KUBE_LOGTOSTDERR}     \
                            ${KUBE_LOG_LEVEL}       \
                            ${NODE_ADDRESS}         \
                            ${NODE_PORT}            \
                            ${NODE_HOSTNAME}        \
                            ${KUBELET_KUBECONFIG}   \
                            ${KUBE_ALLOW_PRIV}      \
                            ${KUBELET__DNS_IP}      \
                            ${KUBELET_DNS_DOMAIN}   \
                            $KUBELET_SWAP
        Restart=on-failure
        KillMode=process
        
        [Install]
        WantedBy=multi-user.target
        
      • 启动服务

        sudo systemctl daemon-reload
        sudo systemctl start kubelet
        sudo systemctl enable kubelet
        
    • 安装kube-proxy

      • 添加配置文件

        sudo vi ~/kubernetes/cfg/kube-proxy

        # --logtostderr=true: log to standard error instead of files
        KUBE_LOGTOSTDERR="--logtostderr=true"
        
        #  --v=0: log level for V logs
        KUBE_LOG_LEVEL="--v=4"
        
        # --hostname-override="": If non-empty, will use this string as identification instead of the actual hostname.
        NODE_HOSTNAME="--hostname-override=k8s-node1"
        
        # --master="": The address of the Kubernetes API server (overrides any value in kubeconfig)
        KUBE_MASTER="--master=http://172.16.32.10:8080"
        
      • 添加服务文件

        sudo vi /lib/systemd/system/kube-proxy.service

        [Unit]
        Description=Kubernetes Proxy
        After=network.target
        
        [Service]
        EnvironmentFile=-/home/k8s-node1/kubernetes/cfg/kube-proxy
        ExecStart=/home/k8s-node1/kubernetes/bin/kube-proxy 
                        ${KUBE_LOGTOSTDERR} \
                            ${KUBE_LOG_LEVEL}   \
                            ${NODE_HOSTNAME}    \
                            ${KUBE_MASTER}
        Restart=on-failure
        
        [Install]
        WantedBy=multi-user.target
        
      • 启动服务

        sudo systemctl daemon-reload
        sudo systemctl start kube-proxy
        sudo systemctl enable kube-proxy
        
    • 安装flannel

      安装方法和在Master中安装的一样,可以参考上面进行安装。

    3.安装过程遇到过的问题记录


    • failed to start containermanager system validation failed - following cgroup subsystem not mounted:[memory]

      解决方法:

      修/etc/default/grub:

      添加:GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

      更新:update-grub

      重启:sudo systemctl reboot -i

      如果grub没有安装,可以先安装:

      sudo apt install grub-efi-arm64 grub-efi-arm64-bin grub2-common

    • etcdmain: etcd on unsupported platform without ETCD_UNSUPPORTED_ARCH=arm64 set

      解决方法:

      在etcd的服务文件中加上一句:

      Environment=ETCD_UNSUPPORTED_ARCH=arm64 #此行必须添加

    • UDP backend is not supported on this architecture

      解决方法:

      由于flannel预设的backend type是udp,但arm64不支持,所以在etcd中需要指定backend参数:

      etcdctl set /coreos.com/network/config "{\"Network\":\"10.1.0.0/16\",\" Backend \"{\"Type\":\"vxlan\"}}"

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容