在前面的文章中已经水了离线安装单主控的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日