Arm架构安装Kubernetes(k8s)环境(Centos7)

在前面的文章中已经水了离线安装单主控的Kubernetes,虽然是单主控,但是对于多主控集群来说也至少把第一次安装生成的证书放置到其他主控节点才初始化就完事的了。同时也用自己拙略的技术写了一个引导式安装k8s的脚本,但是这一切都是x86架构的虽说都是在Centos7系统上安装的。
最近接触了Arm架构的服务器于是就有了在arm架构上安装的经验,本来我想安装当前yum源最新新的1.21.0的。但是由于自己暂时没有解决Cgroup Driver: cgroupfs的问题和初始化的yaml文件不知道要怎么写只能使用命令行初始化而暂时装回了1.14.0的版本应急了。
本次教程安装

Docker:
Server Version: 18.09.4
Operating System: CentOS Linux 7 (AltArch)
Architecture: aarch64
kubectl:
Client Version: v1.14.0
Server Version: v1.14.0
etcd:
etcd Version: 3.2.32
Git SHA: GitNotFound
Go Version: go1.13
Go OS/Arch: linux/arm64

由于以后需要所以本次将先制作离线源才进行安装,离线源的制作教程我也是找的就不在本次描述了。

添加源
Docker:

cat <<EOF > /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://repo.huaweicloud.com/docker-ce/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/docker-ce/linux/centos/gpg

[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo $basearch
baseurl=https://repo.huaweicloud.com/docker-ce/linux/centos/$releasever/debug-$basearch/stable
enabled=0
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/docker-ce/linux/centos/gpg

[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=https://repo.huaweicloud.com/docker-ce/linux/centos/$releasever/source/stable
enabled=0
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/docker-ce/linux/centos/gpg

[docker-ce-test]
name=Docker CE Test - $basearch
baseurl=https://repo.huaweicloud.com/docker-ce/linux/centos/$releasever/$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/docker-ce/linux/centos/gpg

[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo $basearch
baseurl=https://repo.huaweicloud.com/docker-ce/linux/centos/$releasever/debug-$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/docker-ce/linux/centos/gpg

[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://repo.huaweicloud.com/docker-ce/linux/centos/$releasever/source/test
enabled=0
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/docker-ce/linux/centos/gpg

[docker-ce-nightly]
name=Docker CE Nightly - $basearch
baseurl=https://repo.huaweicloud.com/docker-ce/linux/centos/$releasever/$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/docker-ce/linux/centos/gpg

[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo $basearch
baseurl=https://repo.huaweicloud.com/docker-ce/linux/centos/$releasever/debug-$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/docker-ce/linux/centos/gpg

[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://repo.huaweicloud.com/docker-ce/linux/centos/$releasever/source/nightly
enabled=0
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/docker-ce/linux/centos/gpg
EOF

Kubernetes:

# CentOS/RHEL/Fedora
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-$basearch
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

由于arm服务器是在华为云上面购买的所以我刚开始使用的是华为的镜像源,但是在安装k8s时报个为大小不一致的错误由于赶时间就更换了镜像源。

和之前的教程一样需要进行一些基础操作:
1、修改主机名(可选操作)

hostnamectl --static set-hostname [hostname]

2、关闭防火墙、selinux
防火墙不是必须关闭,如果不关闭需要放行对应端口,selinux在1.21.0的版本官网教程中还是写着需要关闭等到支持了才可以不关闭

service firewalld stop
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
setenforce 0

不关闭防火墙需要放行以下端口(关闭firewall一般是在外部使用硬件防火墙或者使用云主机的安全组进行防护):

控制平面节点:

协议 方向 端口范围 作用 使用者
TCP 入站 6443 Kubernetes API 服务器 所有组件
TCP 入站 2379-2380 etcd 服务器客户端 API kube-apiserver, etcd
TCP 入站 10250 Kubelet API kubelet 自身、控制平面组件
TCP 入站 10251 kube-scheduler kube-scheduler 自身
TCP 入站 10252 kube-controller-manager kube-controller-manager 自身

工作节点:

协议 方向 端口范围 作用 使用者
TCP 入站 10250 Kubelet API kubelet 自身、控制平面组件
TCP 入站 30000-32767 NodePort 服务[1] 所有组件

3、关闭swap(虚拟内存)

# 临时关闭
swapoff -a
# 永久关闭
# 编辑/etc/fstab文件,注释/dev/mapper/centos-swap swap这一行的挂载
sed -i 's@/dev/mapper/centos-swap@#/dev/mapper/centos-swap@g' /etc/fstab

4、配置内核参数
不和之前的文章一样贴一长串了,这个是必须要配置修改的内核参数[2]

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

5、配置hosts和挂载硬盘
配置hosts,对应主机名和IP的映射关系,挂载硬盘这一步不是必要条件。至少为了让docker工作目录有足够大的空间否则回以为磁盘空间不足出现各种问题。
由于将挂载磁盘定位为非必要操作所以后面也不提及软链接了,有条件还是建议将docker工作目录更改为剩余空间比较大的目录或者将/var/lib/docker软链接过去。否则在后面空间不足迁移目录需要停止docker等服务。

6、安装及配置docker

# 安装指定版本 18.09.4
yum install docker-ce-18.09.4 -y
# 启动docker
service docker start
# 设置开机自启
systemctl enable docker

7、安装及配置kubeadm kubelet

# 安装指定版本 1.14.0 (1.14.3)
yum install kubeadm-1.14.0 kubectl-1.14.0 -y
# 开机自启
systemctl enable kubelet

8、下载镜像
使用kubeadm config images list --kubernetes-version=1.14.0列出当前版本需要的镜像

[root@arm ~]# kubeadm config images list --kubernetes-version=1.14.0
k8s.gcr.io/kube-apiserver:v1.14.0
k8s.gcr.io/kube-controller-manager:v1.14.0
k8s.gcr.io/kube-scheduler:v1.14.0
k8s.gcr.io/kube-proxy:v1.14.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1

可能需要替换成镜像源pull镜像下来然后再tag,比如:

docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.14.0
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.14.0 k8s.gcr.io/kube-apiserver:v1.14.0
# 其他镜像相同的操作

9、安装及配置etcd
截止至我在安装时的时间(2021-04-18)我在github上面下载的etcd-v3.2.32-linux-arm64.tar.gz在使用中回提示etcdmain: etcd on unsupported platform without ETCD_UNSUPPORTED_ARCH=arm64 set. 添加对应环境变量无法解决,虽然直接运行etcd只是提示警告可能跑起来,但是配置成service会因为这个导致启动失败于是只能在arm服务器将源码拉下来修改个文件来“解决”该警告消息[3]

# /etc/systemd/system/etcd.service
cat <<EOF > /etc/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos
 
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
ExecStart=/usr/local/bin/etcd \
  --name=arm-001 \
  --initial-advertise-peer-urls=http://192.168.252.131:2380 \
  --listen-peer-urls=http://192.168.252.131:2380 \
  --listen-client-urls=http://192.168.252.131:2379 \
  --advertise-client-urls=http://192.168.252.131:2379 \
  --initial-cluster-token=etcd-cluster-0 \
  --initial-cluster=arm-001=http://192.168.252.131:2380 \
  --initial-cluster-state=new \
  --data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
 
[Install]
WantedBy=multi-user.target
EOF

# 创建目录 (--data-dir=指定)
mkdir -p /var/lib/etcd

# 重新加载某个服务的配置文件
systemctl daemon-reload
# 开机自启
systemctl enable etcd
# 重启
systemctl restart etcd
# 检查etcd是否正常
etcdctl --endpoints=http://192.168.252.131:2379 cluster-health

注意:需要根据实际情况进行配置:
–name:安装节点的主机名;
–initial-advertise-peer-urls、–listen-peer-urls、–listen-client-urls、–advertise-client-urls、–advertise-client-urls:修改为当前节点的IP地址;
–initial-cluster:修改集群的所有节点的名称以及IP地址(高可用集群)。
提示:将示例中的arm-001、192.168.252.131根据当前的主机名和IP进行对应修改。

10、使用kubeadm初始化

# 使用yaml文件初始化
kubeadm init --config=kubeadm-config.yaml
# 使用命令行初始化
kubeadm init --apiserver-advertise-address 192.168.252.131 --apiserver-cert-extra-sans 192.168.252.131 --apiserver-cert-extra-sans 127.0.0.1 --apiserver-cert-extra-sans 10.96.0.1 --apiserver-cert-extra-sans arm-001 

“init” 命令执行以下阶段:

preflight                    Run pre-flight checks
certs                        Certificate generation
  /ca                          Generate the self-signed Kubernetes CA to provision identities for other Kubernetes components
  /apiserver                   Generate the certificate for serving the Kubernetes API
  /apiserver-kubelet-client    Generate the certificate for the API server to connect to kubelet
  /front-proxy-ca              Generate the self-signed CA to provision identities for front proxy
  /front-proxy-client          Generate the certificate for the front proxy client
  /etcd-ca                     Generate the self-signed CA to provision identities for etcd
  /etcd-server                 Generate the certificate for serving etcd
  /etcd-peer                   Generate the certificate for etcd nodes to communicate with each other
  /etcd-healthcheck-client     Generate the certificate for liveness probes to healthcheck etcd
  /apiserver-etcd-client       Generate the certificate the apiserver uses to access etcd
  /sa                          Generate a private key for signing service account tokens along with its public key
kubeconfig                   Generate all kubeconfig files necessary to establish the control plane and the admin kubeconfig file
  /admin                       Generate a kubeconfig file for the admin to use and for kubeadm itself
  /kubelet                     Generate a kubeconfig file for the kubelet to use *only* for cluster bootstrapping purposes
  /controller-manager          Generate a kubeconfig file for the controller manager to use
  /scheduler                   Generate a kubeconfig file for the scheduler to use
kubelet-start                Write kubelet settings and (re)start the kubelet
control-plane                Generate all static Pod manifest files necessary to establish the control plane
  /apiserver                   Generates the kube-apiserver static Pod manifest
  /controller-manager          Generates the kube-controller-manager static Pod manifest
  /scheduler                   Generates the kube-scheduler static Pod manifest
etcd                         Generate static Pod manifest file for local etcd
  /local                       Generate the static Pod manifest file for a local, single-node local etcd instance
upload-config                Upload the kubeadm and kubelet configuration to a ConfigMap
  /kubeadm                     Upload the kubeadm ClusterConfiguration to a ConfigMap
  /kubelet                     Upload the kubelet component config to a ConfigMap
upload-certs                 Upload certificates to kubeadm-certs
mark-control-plane           Mark a node as a control-plane
bootstrap-token              Generates bootstrap tokens used to join a node to a cluster
kubelet-finalize             Updates settings relevant to the kubelet after TLS bootstrap
  /experimental-cert-rotation  Enable kubelet client certificate rotation
addon                        Install required addons for passing Conformance tests
  /coredns                     Install the CoreDNS addon to a Kubernetes cluster
  /kube-proxy                  Install the kube-proxy addon to a Kubernetes cluster

参数:

--apiserver-advertise-address string
API 服务器所公布的其正在监听的 IP 地址。如果未设置,则使用默认网络接口。
--apiserver-bind-port int32     默认值:6443
API 服务器绑定的端口。
--apiserver-cert-extra-sans stringSlice
用于 API Server 服务证书的可选附加主题备用名称(SAN)。可以是 IP 地址和 DNS 名称。
--cert-dir string     默认值:"/etc/kubernetes/pki"
保存和存储证书的路径。
--certificate-key string
用于加密 kubeadm-certs Secret 中的控制平面证书的密钥。
--config string
kubeadm 配置文件的路径。
--control-plane-endpoint string
为控制平面指定一个稳定的 IP 地址或 DNS 名称。
--cri-socket string
要连接的 CRI 套接字的路径。如果为空,则 kubeadm 将尝试自动检测此值;仅当安装了多个 CRI 或具有非标准 CRI 插槽时,才使用此选项。
--dry-run
不要应用任何更改;只是输出将要执行的操作。
--experimental-patches string
包含名为 "target[suffix][+patchtype].extension" 的文件的目录路径。 例如,"kube-apiserver0+merge.yaml" 或仅仅是 "etcd.json"。 "patchtype" 可以是 "strategic"、"merge" 或 "json" 之一,并且它们与 kubectl 支持的补丁格式匹配。 默认的 "patchtype" 为 "strategic"。 "extension" 必须为 "json" 或 "yaml"。 "suffix" 是一个可选字符串,可用于确定首先按字母顺序应用哪些补丁。
--feature-gates string
一组用来描述各种功能特性的键值(key=value)对。选项是:
IPv6DualStack=true|false (ALPHA - default=false)
-h, --help
init 操作的帮助命令
--ignore-preflight-errors stringSlice
错误将显示为警告的检查列表;例如:'IsPrivilegedUser,Swap'。取值为 'all' 时将忽略检查中的所有错误。
--image-repository string     默认值:"k8s.gcr.io"
选择用于拉取控制平面镜像的容器仓库
--kubernetes-version string     默认值:"stable-1"
为控制平面选择一个特定的 Kubernetes 版本。
--node-name string
指定节点的名称。
--pod-network-cidr string
指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs。
--service-cidr string     默认值:"10.96.0.0/12"
为服务的虚拟 IP 地址另外指定 IP 地址段
--service-dns-domain string     默认值:"cluster.local"
为服务另外指定域名,例如:"myorg.internal"。
--skip-certificate-key-print
不要打印用于加密控制平面证书的密钥。
--skip-phases stringSlice
要跳过的阶段列表
--skip-token-print
跳过打印 'kubeadm init' 生成的默认引导令牌。
--token string
这个令牌用于建立控制平面节点与工作节点间的双向通信。格式为 [a-z0-9]{6}\.[a-z0-9]{16} - 示例:abcdef.0123456789abcdef
--token-ttl duration     默认值:24h0m0s
令牌被自动删除之前的持续时间(例如 1 s,2 m,3 h)。如果设置为 '0',则令牌将永不过期
--upload-certs
将控制平面证书上传到 kubeadm-certs Secret。

11、安装calico
12、工作节点
工作节点只需要安装Docker、kubeadm、kubelet就可用了,当然对于不能直接拉取镜像还是要手动导入或者修改使用镜像源的。。
然后使用kubeadm join加入集群就可用了。
13、设置主控可被调度
只有一台机子由想装k8s的话由于主控默认不可被调度所以需要设置一下。

kubectl taint nodes `hostname` node-role.kubernetes.io/master-

需要集群状态正常才能生效。

注解:
[1]:NodePort 服务 的默认端口范围;使用 * 标记的任意端口号都可以被覆盖,所以你需要保证所定制的端口是开放的。
[2]:确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter;为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1。
[3]:在判断环境的方法那增加arm64架构为true

参考:

Kubernetes 文档:
https://kubernetes.io/zh/docs/home/

ChiuYut

2021年4月22日

发布者

ChiuYut

咦?我是谁?这是什么地方? Ya ha!我是ChiuYut!这里是我的小破站!