作者:石义峰
起源:恒生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... |
docker | 1.13+ 下载地址及阐明:https://www.docker.com |
etcd | 3+ 下载地址及阐明:https://github.com/coreos/etc... |
版本偏差策略
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 <<EOF | sudo tee /etc/modules-load.d/k8s.confbr_netfilterEOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOFsudo sysctl --system
查看所需端口
管制节点
协定 | 方向 | 端口范畴 | 作用 | 使用者 |
---|---|---|---|---|
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 <<EOF | sudo tee /etc/modules-load.d/containerd.confoverlaybr_netfilterEOFsudo modprobe overlaysudo modprobe br_netfilter# 设置必须的 sysctl 参数,这些参数在重新启动后依然存在。cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.confnet.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1net.bridge.bridge-nf-call-ip6tables = 1EOF# 利用 sysctl 参数而无需重新启动sudo sysctl --system
装置 :
- 从官网Docker仓库装置
containerd.io
软件包。能够在 装置 Docker 引擎 中找到无关为各自的 Linux 发行版设置 Docker 存储库和装置containerd.io
软件包的阐明。 配置 containerd:
sudo mkdir -p /etc/containerdcontainerd config default | sudo tee /etc/containerd/config.toml
重新启动 containerd:
sudo systemctl restart containerd
装置Docker
- 在每个节点上,依据装置 Docker 引擎 为你的 Linux 发行版装置 Docker。 最新的通过验证的 Docker 版本 依赖关系:https://github.com/kubernetes...
配置 Docker 守护程序,尤其是应用 systemd 来治理容器的 cgroup。
sudo mkdir /etc/dockercat <<EOF | sudo tee /etc/docker/daemon.json{ "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2"}EOF
阐明: 对于运行 Linux 内核版本 4.0 或更高版本,或应用 3.10.0-51 及更高版本的 RHEL 或 CentOS 的零碎,
overlay2
是首选的存储驱动程序。重新启动 Docker 并在启动时启用:
sudo systemctl enable dockersudo systemctl daemon-reloadsudo systemctl restart docker
装置kubeadm、kubelet、kubectl
kubeadm
:用来初始化集群的指令。kubelet
:在集群中的每个节点上用来启动 Pod 和容器等。kubectl
:用来与集群通信的命令行工具。
获取
cat <<EOF >
/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/ku...
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/ku...
https://mirrors.aliyun.com/ku...
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 <args>
示例参考:
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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo 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 <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
如果没有令牌,能够通过在管制立体节点上运行以下命令来获取令牌:
kubeadm token list
输入相似于以下内容:
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS8ewj1p.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.or...
运行第一个hello world
kubectl run -it --rm [定义的名称] --image=[你的镜像地址]--restart=Never -- echo “hello world"