架构

k8s的组件架构图

OCI (Open Container Initiative) 开放容器标准。是一个轻量级,开放的治理结构(项目),在 Linux 基金会的支持下成立,致力于围绕容器格式和运行时创建开放的行业标准。

Protobu是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。可以进行数据编码,提高数据压缩率。

RPC (Remote Procedure Call)是远程过程调用,就是将一个服务调用封装在一个本地方法中,让调用者像使用本地方法一样调用服务,对其屏蔽实现细节。而具体的实现是通过调用方和服务方的一套约定,基于TCP长连接进行数据交互达成。

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。

  • 核心层:Kubernetes 最核心的功能,对外提供 API 构建高层的应用,对内提供插件式应用执行环境

  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS 解析等)

  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态 Provision 等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy 等)

  • 接口层:kubectl 命令行工具、客户端 SDK 以及集群联绑

  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴

  1. Kubernetes 外部:日志、监控、配置管理、CI、CD、Workflow<工作流>等
  2. Kubernetes 内部:CRI、CNI、CVI、镜像仓库、CloudProvider、集群自身的配置和管理等

这里使用的是kubeadm工具来进行集群的搭建。

kubeadm是Kubernetes 官方提供的用于快速安装Kubernetes 集群的工具,通过将集群的各个组件进行容器化安装管理,通过kubeadm的方式安装集群比二进制的方式安装要方便不少,但是kubeadm还处于 beta 状态,还不能用于生产环境,Using kubeadm to Create a Cluster文档中已经说明 kubeadm 将会很快能够用于生产环境了。 对于现阶段想要用于生产环境的,建议参考文档:follow-me-install-kubernetes-cluster

环境 (所有节点)

我们这里准备三台Centos7的主机用于安装,后续节点可以根据需要添加即可

配置之前,建议升级内核

CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的Docker、Kubernetes 不稳定。

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry中是否包含 initrd16 配置,如果没有,再安装一次!
yum --disablerepo="*" --enablerepo=elrepo-kernel list available
yum --enablerepo=elrepo-kernel install -y kernel-lt
# 重新创建内核配置. 设置开机从新内核启动
grub2-set-default 0

重启机器:

reboot

hosts 解析:

cat /etc/hosts
192.168.11.11 k8s-master
#最低配置 2G 2C
192.168.11.12 k8s-node01
192.168.11.13 k8s-node02
192.168.11.16 img.zx.com
#harbor仓库 #根据解析修改各主机的主机名

禁用防火墙:

systemctl stop firewalld

systemctl disable firewalld

禁用SELINUX:

setenforce 0

cat /etc/selinux/config

SELINUX=disabled

创建/etc/sysctl.d/k8s.conf文件,添加如下内容:

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

执行如下命令使修改生效:

sysctl -p /etc/sysctl.d/k8s.conf

关闭 swap 交换分区

swapoff -a

sed -i '/swap/s/^/#/' /etc/fstab

所有节点配置并安装 kubeadm、kubelet、kubectl

首先,我们要准备相关的yum源文件

#阿里云 yum 源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #阿里云的 k8s 源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

安装 Kubelet、Kubeadm 和 Kubectl

# 搜索 kubeadm 版本
yum list kubeadm --showduplicates | sort -r # 选择 1.20.9 版本
#yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 # Kubelet 设置开机启动
systemctl enable kubelet
# kubelet 刚安装完成后,通过 systemctl start kubelet 方式是无法启动的,需要加入节点或初始化为 master 后才可启动成功。

master节点 生成初始化配置文件

Kubeadm 提供了很多配置项,Kubeadm 配置在 Kubernetes 集群中是存储在ConfigMap 中的,也可将这些配置写入配置文件,方便管理复杂的配置项。Kubeadm 配置内容是通过 kubeadm config 命令写入配置文件的。

kubeadm config print init-defaults > init-config.yaml
# 其中,kubeadm config 除了用于输出配置项到文件中,还提供了其他一些常用功能
# kubeadm config view
# 查看当前集群中的配置值。
# kubeadm config print join-defaults
# 输出 kubeadm join 默认参数文件的内容。
# kubeadm config images list
# 列出所需的镜像列表。
# kubeadm config images pull
# 拉取镜像到本地。
# kubeadm config upload from-flags
# 由配置参数生成 ConfigMap。

修改初始化配置文件

vim init-config.yaml
10 kind: InitConfiguration # 功能块类型 用于定义初始化配置,如初始化使用的 token 以及apiserver 等。
12 advertiseAddress: 192.168.11.11 # master节点IP地址
16 name: k8s-master # 如果使用域名保证可以解析,或直接使用IP地址
31 dataDir: /var/lib/etcd # etcd 容器挂载到本地的目录
32 imageRepository:
registry.aliyuncs.com/google_containers # 修改为国内地址
33 kind: ClusterConfiguration
#用于定义 apiserver、etcd、network、scheduler、controller-manager 等 master 组件相关配置项。
38 podSubnet: 10.244.0.0/16
# 因为我们这里选择 flannel 作为 Pod 的网络插件,所以需要新增加Pod网段 10.244.0.0/16

拉取所需镜像

kubeadm config images list --config init-config.yaml
kubeadm config images pull --config init-config.yaml
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rancher/mirrored-flannelcni-flannel v0.18.1 e237e8506509 4 months ago 62.3MB
rancher/mirrored-flannelcni-flannel-cni-plugin v1.1.0 fcecffc7ad4a 4 months ago 8.09MB
#这里就放两条哈~

配置 cgroup 驱动

安装完成后,还需要对kubelet进行配置,因为用yum源的方式安装的kubelet生成的配置默认--cgroup-driver为systemd,容器运行时和kubelet使用systemd作为cgroup驱动,以此使系统更为稳定。可以通过docker info命令查看:

docker info |grep Cgroup
Cgroup Driver: cgroupfs

所有节点在配置文件里设置使用systemd驱动

more /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"insecure-registries": ["http://img.zx.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl daemon-reload
systemctl restart docker docker info |grep Cgroup

  

集群初始化安装

在master节点上用kubeadm命令来初始化我们的集群了:

kubeadm init --config init-config.yaml

命令非常简单,就是kubeadm init,如果出现 running with swap on is not supported. Please disable swap 之类的错误,则是没有关闭swap 分区。

成功初始化的输出为:

...
Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.11.11:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash
sha256:e399949a218139237d8023abf2879fbf3e387c2dcc0fadc3d4c18657ce71041d

注意将上面的加入集群的命令保存下来。 默认token有效期为24小时,当过期之后,该token不可用。

如需重新创建token

kubeadm token create --print-join-command
kubeadm join 192.168.11.11:6443 --token
di3w44.8kthobqs6ggsn7qu --discovery-token-ca-cert-hash sha256:9c0433ae5101b016392e14dc320452c5a3dab7ffee8179d48a85db7d7f035110

初始化的输出信息记录了 kubeadm 初始化整个集群的过程,生成相关的各种证书、kubeconfig 文件、bootstraptoken 等等,后边是使用kubeadm join 往集群中添加节点时用到的命令,下面的命令是配置如何使用kubectl访问集群的方式:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf
$HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

新节点加入集群执行以下命令:

kubeadm join 192.168.11.11:6443 --token
di3w44.8kthobqs6ggsn7qu --discovery-token-ca-cert-
hash sha256:9c0433ae5101b016392e14dc320452c5a3dab7ffee8179d48a85db7d7f035110

使用 kubectl 来查看集群的信息:

kubectl get cs
# component statuses 组件状态
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"} kubectl get csr
# certificate signing requests 证书签名请求
······ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 62m v1.18.0
k8s-node01 NotReady <none> 47m v1.18.0
k8s-node02 NotReady <none> 47m v1.18.0

如果集群安装过程中遇到问题,可以使用下面的命令来进行重置:

kubeadm reset
# 将所有节点都重置,然后重新安装
ifconfig cni0 down && ip link delete cni0
rm -rf /var/lib/cni/

Kubectl 自动补全

Kubectl 命令提供了自动补全功能,需要手动安装这个功能:

source <(kubectl completion bash)

echo "source <(kubectl completion bash)" >> ~/.bashrc

安装 Pod Network

选择安装flannel网络插件,和安装普通的 pod 一样:

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 此配置文件里的镜像需要科学/上网才能下载,可以选择使用离线的镜像包 kubectl apply -f kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

注意:如果节点有多个网卡的话,需要在 kube-flannel.yml 中使用--iface参数指定集群主机内网网卡的名称,否则可能会出现 dns 无法解析。flanneld 启动参数加上--iface=

 args:

- --ip-masq

- --kube-subnet-mgr

- --iface=eth0

安装完成后使用 kubectl get pods 命令可以查看到我们集群中的组件运行状态,如果都是Running 状态的话,那么恭喜你,你的 master 节点安装成功了。

kubectl get pods -A

  

添加节点

同样的上面的环境配置、docker 安装、kubeadmin、kubelet、kubectl这些都在Node(192.168.11.12)节点安装配置好过后,我们就可以直接在Node 节点上执行kubeadm join 命令了(上面初始化的时候有)

如果出现下面的错误信息:

[discovery] Failed to request cluster info, will try again:[Gethttps://192.168.11.11:6443/api/v1/namespaces/kube-public/configmaps/cluster-info: x509: certificate has expired or is not yet valid],应该是 master 和 node 之间时间不同步造成的,执行 ntp 时间同步后,重新init、join即可。

如果 join 的时候出现下面的错误信息:[ERROR CRI]: unable to check if the container runtime at "/var/run/dockershim.sock" is running: fork/exec/usr/bin/crictl -r /var/run/dockershim.sock info: no such file or directory,这个是因为 cri-tools 版本造成的错误,可以卸载掉即可:yum remove cri-tools。

该节点加入到集群之后,把 master 节点的~/.kube/config文件拷贝到当前节点对应的位置即可使用 kubectl 命令行工具了。

Kubernetes--用kubeadm搭建集群环境的更多相关文章

  1. Hadoop化繁为简-从安装Linux到搭建集群环境

    简介与环境准备 hadoop的核心是分布式文件系统HDFS以及批处理计算MapReduce.近年,随着大数据.云计算.物联网的兴起,也极大的吸引了我的兴趣,看了网上很多文章,感觉还是云里雾里,很多不必 ...

  2. Hadoop化繁为简(一)-从安装Linux到搭建集群环境

    简介与环境准备 hadoop的核心是分布式文件系统HDFS以及批处理计算MapReduce.近年,随着大数据.云计算.物联网的兴起,也极大的吸引了我的兴趣,看了网上很多文章,感觉还是云里雾里,很多不必 ...

  3. Kubernetes 使用kubeadm创建集群

    镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 实践环境 CentOS-7-x86_64-DVD-1810 Docker 19.03.9 Kubernetes version: v1.20.5 ...

  4. druid 搭建集群环境

    下载druid 下载地址 http://static.druid.io/artifacts/releases/druid-services-0.6.145-bin.tar.gz 解压 tar -zxv ...

  5. 基于redis 3.x搭建集群环境

    由于我团队开发的在线坐席系统,即将面对线上每周3000W的下行投放客户,产品的咨询量可能会很大,基于前期,200W的投放时,前10分钟,大概800问题量,平均一个客户大概8个问题,也就是说每分钟10个 ...

  6. linux下安装 zookeeper-3.4.9并搭建集群环境

    本文主要记录作者在实践过程中实现在centos7环境下安装zookeeper并搭建集群的详细步骤,关于zookeeper本文将不做详细介绍,安装步骤详情如下: 前提准备:3台linux服务器(因为zo ...

  7. kubernetes使用kubeadm升级集群

    升级前准本  官网: https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-upgrade/查看可升级的组件 [root@h ...

  8. 记录nginx 搭建集群环境踏过的坑

    因为生产环境做了负载均衡,为了尽可能跟线上环境一致,所以想在本地也搭集群,这样测试更靠谱.首先就想到nginx 这货,搭个简单的web 服务器实在太简单了. nginx 这玩意11年简单玩过,那是版本 ...

  9. Arcgis Server 10.4.1 搭建集群环境

    1.准备工作 Arcgis Server 10.4.1  以及许可一枚 共享存储(通过UNC路径访问,如"\\server1\arcgisserver\") 服务器两台(虚拟机也可 ...

  10. hadoop问题锦集(一)-搭建集群环境时的常见问题

    1.没有主机的路由 1.namenode与datanode之间ping不通了 2.防火墙得关闭: ufw status ufw disabled 2. ssh localhost ssh:connec ...

随机推荐

  1. zzul1073_Java

    import java.util.Scanner;/** * 限制解是正数,且脚数为偶数即可 */public class zzul1073 { public static void main(Str ...

  2. win10 优化关键字

    powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61 通知和操作 自动维护 存储 个性化 透明效果 启动 登录选项 更新或重启后 ...

  3. Codeforces Global Round 17

    Codeforces Global Round 17 A. Anti Light's Cell Guessing 坑点:\(n=1,m=1\) 时答案为 \(0\) . 其他情况:当 \(n=1\) ...

  4. http如何全站301重定向到https

    对于301重定向这一概念玩SEO的同志们都不陌生了,近些年来https协议越来越火,谷歌已经明确了使用https相对http来说会有更好的排名,再加上百度大大已经明确了对https的扶持政策,老威现在 ...

  5. element ui form 表单 校验upload是否有上传

    查到资料 可以绑定在一个多选上,校验此绑定的值 1 <el-form-item label="上传图片" prop="双向绑定值"> 2 <e ...

  6. 搭建 springboot 应用

    一.采用 Spring Initializr 搭建springboot应用 步骤: 1.只需要打开网址: https://start.spring.io/: 2.选择使用 Maven 构建,语言 ja ...

  7. 剑指 Offer II 回溯法

    086. 分割回文子字符串 用substr枚举 因为是连续的 不是放与不放的问题 class Solution { public: vector<vector<string>> ...

  8. Ginan-PEA例程下载

    输入以下命令可在Ubuntu系统中进行下载,但受到网络限制并不能有效下载或者下载很慢 python3 scripts/download_examples.py 通过阅读python脚本,可将下载网址拷 ...

  9. C# List间的交集并集差集

    一.简单类型List的交集并集差集 1.先定义两个简单类型的List List<int> listA = new List<int>() { 1, 2, 3, 4, 5, 6, ...

  10. -behaviour()的使用,他具体有什么作用

    Eralng 编程中的OTP OTP里面创建进程时 常用有四大behaviour • supervisor • gen_server • gen_fsm • gen_event 在erlang的编译器 ...