作者:石义峰
来源: 恒生LIGHT云社区
![]()
k8s安装配置运行
安装环境建议
k8s系统由一组可执行程序组成,可在GitHub上k8s项目页面下载编译好的二进制安装包,也可直接下载其源码编译后安装。
安装环境可参照k8s官网,建议如下:
- 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
- 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
- 2 CPU 核或更多
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见 这里了解更多详细信息。
- 开启机器上的某些端口。请参见 这里 了解更多详细信息。
- 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。
| 软硬件 | 推荐配置 |
|---|---|
| CPU/内存 | Master:至少2C2G Node:根据具体需要运行的容器数量调整 |
| Linux操作系统 | Redhat 7+ Centos 7+ |
| K8S | 1.18+ 下载地址及说明: https://github.com/kubernetes/kubernetes/releases |
| docker | 1.13+ 下载地址及说明: https://www.docker.com |
| etcd | 3+ 下载地址及说明: https://github.com/coreos/etcd/releases |
版本偏差策略
kube-apiserver
在HA 集群中, 多个
kube-apiserver 实例小版本号最多差1。
kubelet
kubelet 版本号不能高于
kube-apiserver,最多可以比
kube-apiserver 低两个小版本。
说明: 如果 HA 集群中多个
kube-apiserver实例版本号不一致,相应的kubelet版本号可选范围也要减小。
kube-controller-manager、 kube-scheduler 和 cloud-controller-manager
kube-controller-manager、
kube-scheduler 和
cloud-controller-manager 版本不能高于
kube-apiserver 版本号。 最好它们的版本号与
kube-apiserver 保持一致,但允许比
kube-apiserver 低一个小版本(为了支持在线升级)。
说明: 如果在 HA 集群中,多个
kube-apiserver实例版本号不一致,他们也可以跟 任意一个kube-apiserver实例通信(例如,通过 load balancer), 但kube-controller-manager、kube-scheduler和cloud-controller-manager版本可用范围会相应的减小。
kubectl
kubectl 可以比
kube-apiserver 高一个小版本,也可以低一个小版本。
说明: 如果 HA 集群中的多个
kube-apiserver实例版本号不一致,相应的kubectl可用版本范围也会减小。
k8s安装
确保每个节点上 MAC 地址和 product_uuid 的唯一性
- 你可以使用命令
ip link或ifconfig -a来获取网络接口的 MAC 地址 - 可以使用
sudo cat /sys/class/dmi/id/product_uuid命令对 product_uuid 校验
一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。
检查网络适配器
如果你有一个以上的网络适配器,同时你的 Kubernetes 组件通过默认路由不可达,我们建议你预先添加 IP 路由规则,这样 Kubernetes 集群就可以通过对应的适配器完成连接。
允许iptables检查桥接流量
确保
br_netfilter 模块被加载。这一操作可以通过运行
lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行
sudo modprobe br_netfilter。
为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的
sysctl 配置中将
net.bridge.bridge-nf-call-iptables 设置为 1。例如:
cat <
检查所需端口
控制节点
| 协议 | 方向 | 端口范围 | 作用 | 使用者 |
|---|---|---|---|---|
| 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 服务† | 所有组件 |
以上是节点的默认端口范围,需要保证所定制的端口是开放的。
虽然控制节点已经包含了 etcd 的端口,也可以使用自定义的外部 etcd 集群,或是指定自定义端口。
使用的 Pod 网络插件 也可能需要某些特定端口开启。由于各个 Pod 网络插件都有所不同, 请参阅各自文档中对端口的要求。
安装runtime:containerd/docker
安装containerd
安装和配置的先决条件:
cat <
安装 :
- 从官方Docker仓库安装
containerd.io软件包。可以在 安装 Docker 引擎 中找到有关为各自的 Linux 发行版设置 Docker 存储库和安装containerd.io软件包的说明。 -
配置 containerd:
sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml -
重新启动 containerd:
sudo systemctl restart containerd
安装Docker
- 在每个节点上,根据 安装 Docker 引擎 为你的 Linux 发行版安装 Docker。 最新的经过验证的 Docker 版本 依赖关系: https://github.com/kubernetes/kubernetes/blob/master/build/dependencies.yaml
-
配置 Docker 守护程序,尤其是使用 systemd 来管理容器的 cgroup。
sudo mkdir /etc/docker cat <说明: 对于运行 Linux 内核版本 4.0 或更高版本,或使用 3.10.0-51 及更高版本的 RHEL 或 CentOS 的系统,
overlay2是首选的存储驱动程序。 -
重新启动 Docker 并在启动时启用:
sudo systemctl enable docker sudo systemctl daemon-reload sudo systemctl restart docker
安装kubeadm、kubelet、kubectl
-
kubeadm:用来初始化集群的指令。 -
kubelet:在集群中的每个节点上用来启动 Pod 和容器等。 -
kubectl:用来与集群通信的命令行工具。
获取
cat <
/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
安装
yum install kubelet kubeadm kubectl
安装k8s集群
初始化控制节点
控制平面节点是运行控制平面组件的机器, 包括 etcd(集群数据库) 和 API Server(命令行工具 kubectl与之通信)。
- (推荐)如果计划将单个控制平面 kubeadm 集群升级成高可用, 你应该指定
--control-plane-endpoint为所有控制平面节点设置共享端点。 端点可以是负载均衡器的 DNS 名称或 IP 地址。 - 选择一个Pod网络插件,并验证是否需要为
kubeadm init传递参数。 根据你选择的第三方网络插件,你可能需要设置--pod-network-cidr的值。
要初始化控制平面节点,运行:
kubeadm init
示例参考:
kubeadm init —image-repository=daocloud.io/daocloud —kubernetes-version=v1.17.4 —pod-network-cidr=10.252.0.0/16 —upload-certs
配置kubectl
要使非 root 用户可以运行 kubectl,请运行以下命令, 它们也是
kubeadm init 输出的一部分:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
或者,如果你是
root 用户,则可以运行:
export KUBECONFIG=/etc/kubernetes/admin.conf
加入节点
节点是你的工作负载(容器和 Pod 等)运行的地方。要将新节点添加到集群,请对每台计算机执行以下操作:
- SSH 到机器
- 成为 root (例如
sudo su -) - 运行
kubeadm init输出的命令。例如:
kubeadm join --token : --discovery-token-ca-cert-hash sha256:
如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:
kubeadm token list
输出类似于以下内容:
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
8ewj1p.9r9hcjoqgajrj4gi 23h 2018-06-12T02:51:28Z authentication, The default bootstrap system:
signing token generated by bootstrappers:
'kubeadm init'. kubeadm:
default-node-token
默认情况下,令牌会在24小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:
kubeadm token create
输出类似于以下内容:
5didvk.d09sbcov8ph2amjw
如果你没有
--discovery-token-ca-cert-hash 的值,则可以通过在控制平面节点上执行以下命令链来获取它:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
输出类似于以下内容:
8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78
安装CNI
这里采用calico:
kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
运行第一个hello world
kubectl run -it —rm [定义的名称] —image=[你的镜像地址]—restart=Never — echo “hello world”