创建kubernetes集群
1. 前言
本文主要讲述配置一个最简单的k8s集群, 本集群由 1 个master(master01) 和2个node节点(node01, node02)组成. 当前(2021/02/15) kubernetes的最新稳定版本为v1.20.2. 但是我依然采用的是较老的版本v1.13.2, 因为众多参考文档使用的是这个版本,目前不清楚各组件之间的版本兼容性问题,所以依然采用这个版本,后续经过多次重复安装,验证各版本的兼容性后再回头来更新版本信息。另外网上有很多的k8s实验平台, 只需轻松几个点击, 就可以搭建k8s集群, 如果只是学习目的, 可以跳过这唬人的安装过程, 直接进入概念学习阶段, 等对k8s玩得很溜了再回头来搭建环境. 欲练此功, 不安装k8s也可以. 这里推荐play-with-k8s.com, 创建过程可参考这篇文章只要有github帐号即可以登录使用.
2. 部署工具介绍
部署工具和部署环境有很多种选项
-
常用的部署环境:
IaaS 公有云环境:AWS, GCE, Azure,阿里云等;
Iaas私有云环境: OpenStack和vSphere等;
Baremetal环境(裸金属环境):物理服务器或独立的虚拟机等; -
常用部署工具:
kubeadm
kops
kubespray
Kontena Pharos -
其它更完善的二次封装的常用发行版
Rancher (Labs)
Tectonic (CoreOS)
Openshift (Redhat)
本文主要讲述选择使用kubeadm 采用docker镜像安装,目的是为了更好的掌握kubernetes深层次的概念和运行机制。
主机规划:
主机名 | 虚拟机类型 | 系统 | 配置 | 网络 |
---|---|---|---|---|
master01 | VirtualBox | Centos7.9 | 2U2GB SATA:100GB | IP:192.168.1.71 |
node01 | VirtualBox | Centos7.9 | 2U2GB SATA:50GB | IP:192.168.1.61 |
node01 | VirtualBox | Centos7.9 | 2U2GB SATA:50GB | IP: 192.168.162 |
2.1. 环境要求
各主机(master01, node01, node02)所需的环境如下:
(1) 借助于NTP服务设定各节点时间精确同步;
(2) 借助DNS完成各节点的主机名称解析,测试环境主机较少时可以使用hosts文件进行名称解析;
(3)关闭主机的iptables 或firewall服务,并确保它们被禁止随系统引导过程启动;
(4)各主机禁用SELinux;
(5) 各节点禁用所有Swap设备
(6)若要使用ipvs模型的proxy, 各节点还需要载入ipvs相关的各模块
2.1.1. 设置各主机ip
首先将虚拟机设置为桥接模式
在x86架构上安装CentOs7最小安装时,默认ip地址设置为ipv6,如果需要设置为ipv4,需要进行如下设置。
首先确定以enp打头的网卡
/etc/sysconfig/network-scripts/ifcfg-enp8s0
修改为 IPV6INIT=no
BOOTPROTO="static" # 使用静态IP地址,默认为dhcp
IPADDR="192.168.1.71" # 设置的静态IP地址
NETMASK="255.255.255.0" # 子网掩码
GATEWAY="192.168.1.1" # 网关地址
DNS1="192.168.1.1" # DNS服务器
ONBOOT=yes
修改 /etc/resolv.conf
# 添加域名解析服务
nameserver 192.168.1.1
# 修改后立即重启网络服务,使其生效
systemctl restart network
2.1.2. 设置时钟同步
范围:master01, node01, node02
若各节点可直接访问互联网,直接启动chronyd系统服务,并设定为开机启动
systemctl start chronyd.service
systemctl enable chronyd.service
时钟同步后和主机不一致的解决办法
第一检查
ls -ltr /etc/localtime
#如果不是上海,则修改localtime
lrwxrwxrwx. 1 root root 38 Jun 19 2020 /etc/localtime -> ../usr/share/zoneinfo/America/New_York
如下
1、vi /etc/sysconfig/clock #编辑文件
ZONE="Asia/Shanghai"
UTC=false #设置为false,硬件时钟不与utc时间一致
ARC=false
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #linux的时区设置为上海
systemctl restart chronyd.service
/sbin/hwclock --systohc #设置硬件时间和系统时间一致并校准
不过,建议用户配置使用本地的时间服务器,在节点数量众多时尤其如此。 存在可用的时间服务器时,修改节点的/etc/chrony.conf配置文件,并将时间服务器指向相应的主机即可, 配置格式如下:
server CHRONY-SERVER-NAME-OR-IP iburst
2.1.3. 主机名称解析
范围:master01, node01, node02
出于简化配置步骤的目的,本教程使用hosts文件进行各节点名称解析,文件内容如下所示:
hostnamectl set-hostname <主机名>
vi /etc/hosts
#添加内容如下
192.168.1.71 master01.ilinux.io master01 k8s-master k8s-master.ilinux.io
192.168.1.61 node01.ilinux.io node01 k8s-node01 k8s-node01.ilinux.io
192.168.1.62 node02.ilinux.io node02 k8s-node02 k8s-node02.ilinux.io
2.1.4. 关闭iptables 或firewalld服务
范围:master01, node01, node02
在centos7上, iptables或firewalld服务通常只会安装并启动一种,在不确定具体启动状态的前提下,这里通过同时关闭并禁用二者即可简单达到设定目标。
systemctl stop firewalld.service
systemctl stop iptables.service
systemctl disable firewalld.service
systemctl disable iptables.service
2.1.5. 关闭并禁用SELinux
范围:master01, node01, node02
修改 /etc/sysconfig/selinux 文件,将SELINUX配置设置为disabled
#修改配置文件,永久禁用selinux, 防止重启导致selinux开启
vi /etc/sysconfig/selinux
SELINUX=disabled
# 禁用SELinux 立即生效
setenforce 0
2.1.6. 禁用Swap设备
范围:master01, node01, node02
部署集群时,kubeadm默认会预先检查当前主机是否禁用了swap设备,并在未禁用时强制终止部署过程。因此,在主机内存资源充裕的条件下,需要禁用所有的Swap设备,否则,就需要在后文的kubeadm init及kubeadm join命令执行时额外使用相关的选项忽略检查错误。
关闭Swap设备,需要分两步。首先关闭当前已启用的所有Swap设备:
swapoff -a
然后编辑/etc/fstab配置文件,注释掉swap设备的挂载项(永久关闭swap分区)
2.1.7. 启用ipvs内核模块
范围:master01, node01, node02
创建内核模块载入相关的脚本文件/etc/sysconfig/modules/ipvs.modules, 设定自动载入的内核模块。文件内容如下:
#!/bin/bash
ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
for mod in $(ls $ipvs_mods_dir | grep -o "^[^.]*"); do
/sbin/modinfo -F filename $mod &> /dev/null
if [ $? -eq 0 ]; then
/sbin/modprobe $mod
fi
done
修改文件权限,并手动为当前系统加载内核模块
chmod +x /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
3. 安装程序包(在各主机上完成如下设定)
3.1. 安装 docker (master01, node01 & node02)
安装 docker之前要确定docker版本是否在kubernetes相应版本支持列表里面,以避免遇到版本兼容性问题的坑,这里 列出了部分kubernetes版本与docker版本的兼容信息,希望对你的集群环境搭建有帮助。
3.1.1. 配置docker-ce yum源
范围:master01, node01, node02
# 使用阿里云yum源
sudo curl https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 或者华为云yum源,两者选其一
sudo wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+repo.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 更新yum源缓存
sudo yum makecache fast
#选择合适的版本
yum list docker-ce --showduplicates | sort -r
#安装指定版本
sudo yum -y install docker-ce-18.03.1.ce-1.el7.centos.x86_64
3.1.2. 配置 docker
3.1.2.1. 配置镜像加速
由于dockerhub镜像仓库在国外,访问速度较慢,下载镜像的过程中,多数情况下会因为超时而失败,所以强烈建议配置镜像加速。
另外在整个安装过程中主要需要与internet 上三个镜像仓库打交道
- DockerHub,
- gcr.io 这个几乎不能访问,后面会介绍到如何获得其上相应的镜像
- quay.io , 主要是一些网络组件相关的镜像
$sudo vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://<你的ID>.mirror.aliyuncs.com"],
"live-restore": true,
"debug": true
}
镜像加速列表
提供者 | 镜像地址 |
---|---|
科大镜像 | https://docker.mirrors.ustc.edu.cn/ |
网易 | https://hub-mirror.c.163.com/ |
阿里云 | <https://<你的ID>.mirror.aliyuncs.com> |
七牛云加速器 | https://reg-mirror.qiniu.com |
daocloud加速器 | <http://<你的ID>.m.daocloud.io/> |
其他还有华为云镜像加速,显然是为华为云用户准备的,请参考这篇文章进行配置镜像加速
3.1.2.2. docker iptables FORWARD策略
docker 自1.13版起会自动设置iptables 的 FORWARD默认策略为 DROP,这可能会影响kubernetes集群依赖的报文转发功能,因此,需要在docker服务启动后,重新将FORWARD链的默认策略设置为 ACCEPT,方式是修改/usr/lib/systemd/system/docker.service文件,在 “ExecStart=/usr/bin/dockerd” 一行之后新增加一行内容如下:
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
重载完成后即可启动docker服务:
# 重新加载docker服务设置
systemctl daemon-reload
# 重启docker服务
systemctl start docker
设置为开机自启动
systemctl enable docker
确保默认使用桥接模式
$ sudo sysctl -a | grep bridge
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
如果不是桥接模式(等号后面为0), 手动修改这两个参数
方法1:
修改/etc/sysctl.conf 添加以上两个参数
方法2:
在 /etc/sysctl.d中添加一个以 conf为后缀的文件例如k8s.conf,将以上两项配置添加进去
手动执行 sysctl -p /etc/sysctl.conf 或者sysctl -p /etc/sysctl.d/k8s.conf 使其立即生效
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
3.2. 安装 kubelet (master01)
范围:master01, node01, node02
3.2.1. 配置kubernetes yum源
创建 /etc/yum.repos.d/kubernetes.repo
内容如下:
cat <<EOF > /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源缓存
sudo yum -y makecache fast
#检查版本,选择合适的版本
yum list kubeadm --showduplicates | sort -r
yum list kubelet --showduplicates | sort -r
yum list kubectl --showduplicates | sort -r
yum list kubernetes-cni --showduplicates | sort -r
3.2.2. 安装kubelet
master 和node节点要安装以下软件
sudo yum install -y kubeadm-1.18.2-0.x86_64 kubelet-1.18.2-0.x86_64 kubectl-1.18.2-0.x86_64 kubernetes-cni-0.8.7-0.x86_64
并且要设置为开机启动
systemctl enable kubelet && systemctl start kubelet
说明:
- kubelet 为Kubernetes的核心守护进程之一,负责将配置清单运行为容器(Pod)
- Kubeadm 相当于部署集群本身的一个工具,用于简化集群的安装工作,负责根据配置文件部署集群,升级集群等等工作。
- kubectl 相当于集群的客户端,负责和集群的API组件交互,比如查询node 的状态,容器的运行情况,以及提交任务等等。
3.2.3. 配置kubelet
如果未禁用swap设备,则需要编辑kubelet的配置文件/etc/sysconfig/kubelet, 设置忽略Swap启用的状态错误, 内容如下:
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
4. 配置Master 和 Nodes
components规划
主机名 | 组件 | 备注 |
---|---|---|
master01 | kubelet (yum 安装) kubadm (yum 安装) kubectl(yum 安装) docker (yum 安装) kube-apiserver (Pod)kube-scheduler (Pod) kub-controller-manager (Pod) cni (flannel Pod) etcd (Pod) kube-proxy (Pod) | |
node01 | kubelet (yum 安装) docker (yum 安装) cni (flannel Pod) kube-proxy (Pod) | |
node02 | kubelet (yum 安装) docker (yum 安装) cni (flannel Pod) kube-proxy (Pod) |
4.1. 插件安装
Metrics-Server(Pod)
Dashboard (Pod)
CoreDNS (Pod)
EFK (Pod)
Prometheus (Pod)
Ingress-Controller (Pod)
4.2. 配置master节点
4.2.1. 拉取必要的镜像
说明:k8s.gcr.io上的镜像由于无法描述的原因,在国内无法直接拉取。但是阿里云registry中共享了相应版本的kubernetes镜像,这里再次感谢阿里的无私贡献,敬佩阿里的企业文化(利他),不仅免费,还有消耗阿里云的大量带宽。由于docker镜像命名规范的原因,拉取下来后要重新打tag 才能使用,以下脚本包含了拉取镜像,更名,清理的功能。本人把安装文档写得足够详细,向阿里致敬!
kubeadm init --kubernetes-version=1.18.1 --apiserver-advertise-address=192.168.1.71 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
注意修改apiserver-advertise-address为master节点ip
参数解释:
–kubernetes-version: 用于指定k8s版本;
–apiserver-advertise-address:用于指定kube-apiserver监听的ip地址,就是 master本机IP地址。
–pod-network-cidr:用于指定Pod的网络范围; 10.244.0.0/16
–service-cidr:用于指定SVC的网络范围;
–image-repository: 指定阿里云镜像仓库地址
这一步很关键,由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过–image-repository指定阿里云镜像仓库地址
4.2.2. 初始化master
kubeadm init命令支持两种初始化方式, 一是通过命令行选项传递关键部署设定,另一种是基于yaml格式的kubeadm专用配置文件,后一种运行用户自定义各种部署参数。下面分别给出了两种实现方式的配置步骤,建议读者采用第二种方式进行。
4.2.2.1. 初始化方式一
systemctl enable kubelet.service
systemctl start kubelet.service
kubeadm init --kubernetes-version=v1.13.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
命令中的各选项说明:
(1)--kubernetes-version 选项的版本号用于指定要部署的kubernetes程序版本,它需要与预拉取的kubernetes 镜像版本一致参考脚本变量(K8S_VERSION)
(2)--pod-network-cidr 选项用于指定 pod网络的网段,它通常应该与要部署使用的网络插件(例如 flannel, calico等)的默认设定保持一致, 10.244.0.0/16是flannel默认使用的网络;
(3)--service-cidr用于指定为 Service分配使用的网络地址,它由kubernetes管理, 默认即为10.96.0.0/12
(4)最后一个选项 --ignore-preflight-errors=Swap 防止未禁用swap设备而导致初始化失败,生产环境建议关闭swap设备,已获得更好的性能,请参考前述禁用 swap分区进行设定。
(5)这里需要读者对kubernetes的三层网(node网络,pod网络,service 网络)知识有所了解,再来做相关参数的调整。
4.2.2.2. 初始化方式二
kubeadm也可以通过配置文件加载配置, 以定制更丰富的部署选项。以下是符合前述命令设定方式的使用示例,不过,它明确定义了kubeProxy的模式为ipvs, 并支持通过修改imageRepository的值修改获取系统镜像时使用的镜像仓库。
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.13.2
api:
advertiseAddress: 192.168.1.71
bindPort: 6443
controlPlaneEndpoint: ""
imageRepository: k8s.gcr.io
kubeProxy:
config:
mode: "ipvs"
ipvs:
ExcludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 30s
kubeletConfiguration:
baseConfig:
cgroupDriver: cgroupfs
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
failSwapOn: false
resolvConf: /etc/resolv.conf
staticPodPath: /etc/kubernetes/manifests
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
将上面的内容保存于配置文件中, 例如kuberadm-config.yaml, 而后执行相应的命令:
# kubeadm init --config kubeadm-config.yaml --ignore-prelight-errors=Swap
注意:对于kubernetes 系统的新用户来说,无论使用上述哪种方式,命令运行结束后,请记录最后的kubeadm join 命令输出的最后提示的操作步骤。 下面的内容是需要用户记录的一个命令输出示例,它提示了后续需要操作的步骤:
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
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/
you can now join any number of machines by running the following on each node as root:
kubeadm join 172.168.0.70:6443 --token uoutlc.aknhy63zioieuw9x --discovery-toke-ca-cert-hash sha256:cd8bd32c9be6c88573c56f
接下来要部署一个 podnetwork addon
以flannel为例:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
vi kube-flannel.yml
---
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp.flannel.unprivileged
annotations:
seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:
privileged: false
volumes:
- configMap
- secret
- emptyDir
- hostPath
allowedHostPaths:
- pathPrefix: "/etc/cni/net.d"
- pathPrefix: "/etc/kube-flannel"
- pathPrefix: "/run/flannel"
readOnlyRootFilesystem: false
# Users and groups
runAsUser:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
fsGroup:
rule: RunAsAny
# Privilege Escalation
allowPrivilegeEscalation: false
defaultAllowPrivilegeEscalation: false
# Capabilities
allowedCapabilities: ['NET_ADMIN', 'NET_RAW']
defaultAddCapabilities: []
requiredDropCapabilities: []
# Host namespaces
hostPID: false
hostIPC: false
hostNetwork: true
hostPorts:
- min: 0
max: 65535
# SELinux
seLinux:
# SELinux is unused in CaaSP
rule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: flannel
rules:
- apiGroups: ['extensions']
resources: ['podsecuritypolicies']
verbs: ['use']
resourceNames: ['psp.flannel.unprivileged']
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- apiGroups:
- ""
resources:
- nodes
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes/status
verbs:
- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: flannel
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: flannel
subjects:
- kind: ServiceAccount
name: flannel
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: flannel
namespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:
name: kube-flannel-cfg
namespace: kube-system
labels:
tier: node
app: flannel
data:
cni-conf.json: |
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kube-flannel-ds
namespace: kube-system
labels:
tier: node
app: flannel
spec:
selector:
matchLabels:
app: flannel
template:
metadata:
labels:
tier: node
app: flannel
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
hostNetwork: true
priorityClassName: system-node-critical
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: flannel
initContainers:
- name: install-cni
image: quay.io/coreos/flannel:v0.13.1-rc2
command:
- cp
args:
- -f
- /etc/kube-flannel/cni-conf.json
- /etc/cni/net.d/10-flannel.conflist
volumeMounts:
- name: cni
mountPath: /etc/cni/net.d
- name: flannel-cfg
mountPath: /etc/kube-flannel/
containers:
- name: kube-flannel
image: quay.io/coreos/flannel:v0.13.1-rc2
command:
- /opt/bin/flanneld
args:
- --ip-masq
- --kube-subnet-mgr
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "100m"
memory: "50Mi"
securityContext:
privileged: false
capabilities:
add: ["NET_ADMIN", "NET_RAW"]
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
volumeMounts:
- name: run
mountPath: /run/flannel
- name: flannel-cfg
mountPath: /etc/kube-flannel/
volumes:
- name: run
hostPath:
path: /run/flannel
- name: cni
hostPath:
path: /etc/cni/net.d
- name: flannel-cfg
configMap:
name: kube-flannel-cfg
注意:kubernetes本身没有pod网络创建和管理功能,其本身只提供了一组依赖网络组件的接口,网络功能一般有第三方插件完成,比如 flannel, calico等等。但是Kubernetes 本身集成了 service网络的管理功能,其底层实际是创建一系列iptables 或ipvs规则来完成的。
部署完之后查看kubernetes相关的容器
coredns
etcd
kube-apiserver
kuber-controller
kube-flannel-ds-amd64-bbnz2
kube-proxy
kube-scheduler
4.3. 配置第一个node节点, 并添加到集群
修改ip地址
修改主机名部分,改为k8s-node01
hostnamectl set-hostname k8s-node01
安装软件
sudo yum install -y kubeadm-1.18.2-0.x86_64 kubelet-1.18.2-0.x86_64 kubectl-1.18.2-0.x86_64 kubernetes-cni-0.8.7-0.x86_64
并且要设置为开机启动
systemctl enable kubelet && systemctl start kubelet
下载flannel镜像
docker pull registry.cn-hangzhou.aliyuncs.com/daoh/flannel:v0.12.0-amd64
为镜像打tag,保持和yaml文件一样。
docker tag registry.cn-hangzhou.aliyuncs.com/daoh/flannel:v0.12.0-amd64 quay.io/coreos/flannel:v0.12.0-amd64
准备配置文件
mkdir -p /etc/cni/net.d/
vi /etc/cni/net.d/10-flannel.conf
{"name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}}
mkdir -p /usr/share/oci-umount/oci-umount.d
mkdir /run/flannel/
mkdir ~/k8s
cd k8s
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
在master上查询 join string
kubeadm token create --print-join-command
在node上执行查询结果, 加入集群
kubeadm join 192.168.1.71:6443 --token ud6ny7.9wzcg5du5zvrbbfv \
--discovery-token-ca-cert-hash sha256:dffb435eb20f133a8419bd406daf79cf6e4ee6af490xyzsd0ba95f610e5b1ec3
设置开机启动
查看node状态
[root@node01 k8s]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 45h v1.18.2
k8s-node01 Ready <none> 5m52s v1.18.2
4.4. 配置第二个node节点, 并添加到集群
修改ip地址
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
修改ip地址
修改主机名部分,改为k8s-node02
hostnamectl set-hostname k8s-node02
重新启动
重新登录node2
重新初始化节点配置, 执行命令
kubeadm reset
重新加入集群
kubeadm join 192.168.1.71:6443 --token ud6ny7.9wzcg5du5zvrbbfv \
--discovery-token-ca-cert-hash sha256:dffb435eb20f133a8419bd406daf79cf6e4ee6af490xyzsd0ba95f610e5b1ec3
[root@k8s-node02 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 45h v1.18.2
k8s-node01 Ready <none> 31m v1.18.2
k8s-node02 Ready <none> 4m3s v1.18.2
5. 问题排查 troubleshooting
在k8s中,大部分的问题,都能通过logs和describe两个命令进行分析和定位
6. 后记
本技术博客原创文章位于鹏叔的IT技术博客空间 - 创建kubernetes集群, 要获取最近更新请访问原文.
更多技术博客请访问: 鹏叔的IT技术博客空间
7. 参考文档
Kubernetes 1.20版本开始不推荐使用Docker,你知道吗
k8s不再支持docker_k8s 不支持 Docker 了? 别慌!官方最新解释来了…
[Which kubernetes version is supported in docker version 18.09]
单机版kubernetes 1.18.2 安装
https://www.cnblogs.com/zhizihuakai/p/12629514.html
https://blog.csdn.net/llinyunxia/article/details/106160654?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
posted on 2021-03-06 16:26 eagle.supper 阅读(517) 评论(0) 编辑 收藏 举报