一、安装要求
kubeadm安装kubernetes1.15
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
1、一台或多台机器(≥3奇数个),操作系统 CentOS7.x(最好是不低于4.4的内核版本),因为CentOS 7.x 系统自带的3.10.x内核存在一些Bugs.导致运行的Docker.Kubernetes不稳定。
2、硬件配置:至少2GB内存或更多RAM,至少2个CPU或更多CPU,至少硬盘30GB或更多
3、集群中所有机器之间网络互通
4、可以访问外网,需要拉取镜像
5、禁止swap分区
#RAM:随机存取记忆体(RandomAccessMemory),是一种在电脑中用来暂时保存数据的元件。
###环境规划( _ 修改host文件【非集群环境可省略】 _ )
cat >> /etc/hosts<<EOF
10.12.237.17 k8s-master(4cpu,4G,50G)
10.12.237.19 k8s-node1(2cpu,2G,30G)
10.12.237.18 k8s-node2(2cpu,2G,30G)
EOF
二、系统设置
#三台服务器分别设置主机名
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
_ #安装依赖包 _
yum -y install conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget git vim net-tools
_ #设置防火墙为lptables 并设置空规则 _
systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
_ #关闭swap分区和SELINUX(如果不关闭,默认配置下kubelet将无法启动。使用free -m确认swap已经关闭。) _
swapoff -a && sed -ri ‘s/.swap./#&/’ /etc/fstab
setenforce 0 && sed -i ‘s/^SELINUX=.*/SELINUX=disabled/’ /etc/selinux/config
_ #修改时区并关闭系统不需要d的服务 _
timedatectl set-timezone Asia/Shanghai
timedatectl set-local-rtc 0
systemctl restart rsyslog
systemctl restart crond
systemctl stop postfix && systemctl disable postfix
_ #Kubernetes调整内核参数(三个重要部分是必须条件,将桥接的IPv4流量传递到iptables的链) _
cat > kubernetes.conf<<EOF
#开启网桥模式【重要】
net.bridge.bridge-nf-call-iptables=1
#开启网桥模式【重要】
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
#禁止使用swap空间,只有当系统OOM时才允许使用它
vm.swappiness=0
#不检查物理内存是否够用
vm.overcommit_memory=1
#开启OOM
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
#关闭ipv6【重要】
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
_ #将优化内核文件拷贝到/etc/sysctl.d/文件夹下,这样优化文件开机的时候能够被调用 _
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
_ #手动加载内核文件,立即生效 _
modprobe ip_conntrack
sysctl -p /etc/sysctl.d/kubernetes.conf
_ #设置日志的保存方式 _
#在Centos7以后,因为引导方式改为了system.d,所以有两个日志系统同时在工作,默认的是rsyslogd,以及systemd journald,使用systemd journald更好一些,因此我们更改默认为systemd journald,只保留一个日志的保存方式。
#持久化保存日志的目录
mkdir /var/log/journal
mkdir /etc/systemd/journal.conf.d
cat >/etc/systemd/journal.conf.d/99-prophet.conf <<EOF
[Journal]
#持久化保存到磁盘
Storage=persistent
#压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
#最大占用空间10G
SystemMaxUse=10G
#单日志文件最大200M
SystemMaxFileSize=200M
#日志保存时间2周
MaxRetentionSec=2week
#不将日志转发到syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald
_ #升级Linux内核为4.44版本: _
#查看内核升级是否成功
[root@k8s-master ~]# uname -a
Linux k8s-master 4.4.196-1.el7.elrepo.x86_64 #1 SMP Mon Oct 7 16:17:40 EDT 2019 x86_64 x86_64 x86_64 GNU/Linux
_ #kube-proxy开启ipvs的前置条件 _
modprobe br_netfilter
cat >/etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules && lsmod |grep -e ip_vs -e nf_conntrack_ipv4
_ #调整系统时区 _
#设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
#将当前的UTC时间写入硬件时钟
timedatectl set-local-rtc 0
#重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
#下面是修改之前的时区:
#修改之后正确的显示如下:
三、安装docker
_ 1、安装docker _
#一定要安装18.09版docker,否则在初始化k8s master的时候会提示:[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 19.03.3. Latest validated version: 18.09
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io
systemctl start docker
systemctl enable docker
#到这里建议重启一台服务器再次看出内核是否又回到旧版本,如果是就重新执行如下命令(教程视频中讲师有发生过这种情况,我自己没遇到过):
grub2-set-default 0 && reboot
_ 2、修改docker cgroup driver为systemd并重启docker: _
#根据文档CRI installation中的内容,对于使用systemd作为init system的Linux的发行版,使用systemd作为docker的cgroup driver可以确保服务器节点在资源紧张的情况更加稳定,因此这里修改各个节点上docker的cgroup driver为systemd(k8s给出的解释, 大致的意思是:
systemd是系统自带的cgroup管理器, 系统初始化就存在的, 和cgroups联系紧密,为每一个进程分配cgroups, 用它管理就行了. 如果设置成cgroupfs就存在2个cgroup控制管理器, 实验证明在资源有压力的情况下,会存在不稳定的情况.)。
创建或修改/etc/docker/daemon.json:
cat >/etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts":{
"max-size": "100m"
}
}
EOF
systemctl daemon-reload
systemctl restart docker
_ 3、查看结果: _
docker info | grep Cgroup
#四、用kubeadm安装k8s集群
_ #配置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
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#浏览器访问测试地址,是否可用,如果不可用需要科学上网。
https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 ##安装k8s组件,kubeadm,kubelet和kubectl
#由于版本更新频繁,这里指定版本号部署(我第一次安装没指定版本号报错提示版本过高,当时是1.16版)
#yum makecache fast
yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
systemctl enable kubelet
#systemctl start kubelet(先不启动)
以上内容三台服务器都需安装
安装k8s集群
_ #初始化准备 _
#!/bin/sh
### 版本信息
K8S_VERSION=v1.15.1
ETCD_VERSION=3.3.10
#DASHBOARD_VERSION=v1.8.3
FLANNEL_VERSION=v0.12.0-amd64
#DNS_VERSION=1.14.8
PAUSE_VERSION=3.1
coredns_version=1.3.1
## 基本组件
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver-amd64:$K8S_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager-amd64:$K8S_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler-amd64:$K8S_VERSION
docker pull aiotceo/kube-proxy:$K8S_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd-amd64:$ETCD_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:$PAUSE_VERSION
### 网络
#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-sidecar-amd64:$DNS_VERSION
#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-kube-dns-amd64:$DNS_VERSION
#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-dnsmasq-nanny-amd64:$DNS_VERSION
docker pull quay.io/coreos/flannel:$FLANNEL_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/openthings/k8s-gcr-io-coredns:$coredns_version
### 前端
#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:$DASHBOARD_VER
## 修改tag
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver-amd64:$K8S_VERSION k8s.gcr.io/kube-apiserver-amd64:$K8S_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager-amd64:$K8S_VERSION k8s.gcr.io/kube-controller-manager-amd64:$K8S_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler-amd64:$K8S_VERSION k8s.gcr.io/kube-scheduler-amd64:$K8S_VERSION
#docker tag registry.cn-hangzhou.aliyuncs.com/openthings/k8s-gcr-io-kube-proxy-amd64:$K8S_VERSION k8s.gcr.io/kube-proxy-amd64:$K8S_VERSION
docker tag aiotceo/kube-proxy:$K8S_VERSION k8s.gcr.io/kube-proxy-amd64:$K8S_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd-amd64:$ETCD_VERSION k8s.gcr.io/etcd-amd64:$ETCD_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:$PAUSE_VERSION k8s.gcr.io/pause:$PAUSE_VERSION
#docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-sidecar-amd64:$DNS_VERSION k8s.gcr.io/k8s-dns-sidecar-amd64:$DNS_VERSION
#docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-kube-dns-amd64:$DNS_VERSION k8s.gcr.io/k8s-dns-kube-dns-amd64:$DNS_VERSION
#docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-dnsmasq-nanny-amd64:$DNS_VERSION k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:$DNS_VERSION
#docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:$DASHBOARD_VERSION k8s.gcr.io/kubernetes-dashboard-amd64:$DASHBOARD_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/openthings/k8s-gcr-io-coredns:$coredns_version k8s.gcr.io/coredns:$coredns_version
## 删除镜像
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver-amd64:$K8S_VERSION
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager-amd64:$K8S_VERSION
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler-amd64:$K8S_VERSION
#docker rmi registry.cn-hangzhou.aliyuncs.com/openthings/k8s-gcr-io-kube-proxy-amd64:$K8S_VERSION
docker rmi aiotceo/kube-proxy:$K8S_VERSION
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/etcd-amd64:$ETCD_VERSION
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:$PAUSE_VERSION
#docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-sidecar-amd64:$DNS_VERSION
#docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-kube-dns-amd64:$DNS_VERSION
#docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-dnsmasq-nanny-amd64:$DNS_VERSION
#docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:$DASHBOARD_VERSION
docker rmi registry.cn-hangzhou.aliyuncs.com/openthings/k8s-gcr-io-coredns:$coredns_version
三台机器分别执行上面脚本下载镜像:./k8s_image.sh
_ 初始化主节点(master) _
#显示默认的init初始化文件并打印出来存放到指定位置
kubeadm config print init-defaults > kubeadm-config.yaml
#编辑kubeadm-config.yaml,修改本机服务器IP和版本号
advertiseAddress: 10.12.237.17
kubernetesVersion: v1.15.1
#添加pod网段(kubernetesVersion上一行添加即可)
podSubnet: "10.244.0.0/16"
#另外再添加一个字段,把默认的调度方式改为ipvs模式(最后scheduler: {}下面)
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
_ 初始化安装并自动颁发证书 _
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.15.1
#所有的初始化过程信息可以通过kubeadm-init.log文件查看
例如:
环境变量(env)存放的位置:/var/lib/kubelet/kubeadm-flags.env
kubelet配置文件存放位置:/var/lib/kubelet/config.yaml
k8s所有证书的存放位置:/etc/kubernetes/pki
配置文件放在:/etc/Kubernetes
__ 初始化执行结果如下: __
__ 根据提示操作: __
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看node节点(状态显示notready是因为还未部署flannel网络):
_ 部署网络-flannel _
Kubernetes 系统上 Pod 网络的实现依赖于第三方插件,而 Flannel 是由 CoreOS主推的目前比较主流的容器网络解决方案,CNI 插件有两种功能:网络配置和网络策略,由于 flannel 比较简单,并不支持网络策略,flannel 项目自身只是一个框架,真正提供网络功能的是它的后端实现,目前,Flannel 支持三种不同后端实现,分别是:
· UDP( 是 Flannel 项目最早支持的一种方式,是性能最差的方式,目前已被废弃。)
· VXLAN(目前使用较多)
· host-gw
#部署前准备
mkdir install-k8s
mkdir install-k8s/core
mv kubeadm-init.log kubeadm-config.yaml install-k8s/core/
cd install-k8s/
mkdir plugin
mkdir plugin/flannel
cd plugin/flannel/
#下载flannel文件(如果一次失败可以多试两次):
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
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.14.0
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.14.0
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
#创建flannel网络
kubectl create -f kube-flannel.yml
创建完成后查看pod的状态如下(原因可能是是网络差创建flannel的时候有一个pull flannel镜像的过程,等两分钟即可):
kubectl get pod -n kube-system
#-n 后面指定的名称空间,默认k8s的所有系统主键都默认安装在kebe-system的名称空间下,如果不加-n namespace则默认使用default的名称空间
等两分钟之后pod状态变成Running,并会多了一个flannel镜像
#如果一直报错可以查看日志信息(注意指定名称空间参数–namespace=):
#kubectl describe --namespace=kube-system pod kube-flannel-ds-amd64-vfbvb
再查看node节点状态已经变成“ready”
#运行正常后,flanneld 会在宿主机的/etc/cni/net.d 目录下生成自已的配置文件,kubelet 将会调用它。 网络插件运行成功后,Node 状态才 Ready
同时使用ifconfig命令可以看到多加了一块flannel.1的网卡
flannel详解:
- flannel 默认就是 VXLAN 模式,即 Overlay Network(全覆盖网络)。
- flanneld 创建了一个 flannel.1 接口,它是专门用来封装隧道协议的,默认分给集群的 Pod 网段为 10.244.0.0/16。
- flannel 给 k8s-master 节点配置的 Pod 网络为 10.244.0.0 段,给 k8s-node01 节点配置的 Pod 网络为 10.244.1.0 段,如果有更多的节点,以此类推。
#vxlan(虚拟可扩展局域网):是一种基于IP网络(L3)的基础上虚拟(L2)网络连接的解决方案,为多用租户平台提供了虚拟网络强大的扩展能力和隔离性。
overlay network (全覆盖网络)简单说来覆盖网络就是应用层网络,它是面向应用层的
#2012年10月,Linux内核增加了vxlan支持,内核的版本要求3.7+,所以一开始我们就把内核升级到4.4的版本。
清理flannel网络
一、master节点删除flannel(下面删除方式二选一)
1、kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
2、进入存放kube-flannel.yml文件的目录直接删除:
#kubectl delete -f kube-flannel.yml
二、在所有节点清理flannel网络留下的文件(如果没有创建pod那么cni0网桥只有master存在,意味着只要服务器上有cni0和flannel.l就需要执行下面命令)
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/
rm -f /etc/cni/net.d/*
#注意如果有vteh设备的也要清理掉
ifconfig vethdc52a97e down
ip link delete vethdc52a97e
三、清理完成后要重启kubelet
systemctl restart kubelet
子节点加入集群
#master初始化的时候最后打印出如下信息,明显告诉你子节点要加入工作的话需要的执行如下命令
#分别在两个 Node 节点执行
kubeadm join 10.12.237.17:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1bc56d762687199cadade6c5a9f8f4224f6b94f875081a630e3fab84c42ae19f
#两台node节点执行结果如下图:
同样node节点加入集群后也会生成一个flannel.1网桥设备
回到主节点再查看node发现一台变成三台并且从notready变成ready。
master节点详细查看集群原始pod分布情况
kubectl get pod -n kube-system -o wide
#-o wide:查看详细信息
最后查看集群健康状态:
kubectl get cs
#默认情况下集群部署完成后master节点最初有9个pod加上每个pod对应一个pause一共是18个容器,node节点是两个pod对应两个pause一共是4个容器
#只要运行一个pod就会同时伴随启动一个pause;
官网中是这样解释的:
pause是Kubernetes基础设施的一部分,Kubernetes管理的所有pod里,pause容器是第一个启动的,用于实现Kubernetes集群里pod之间的网络通讯
#_ #到此为此kubeadm安装k8s集群安装完成。 _
如果到这里coredns还没起来,可以按如下方法解决
首先看下报错
failed to find plugin “flannel” in path [/opt/cni/bin]
需要下载CNI插件: CNI Plugins v0.8.7 (在1.0.0版本后CNI Plugins中没有flannel了)
将压缩包放到master和worker的/opt/cni/bin目录下,并且解压
然后把之前的coredns删掉,接着就可以看到有两个coredns起来了
#卸载k8s集群
kubeadm reset -f
#卸载k8s服务
modprobe -r ipip
#Linux modprobe命令用于自动处理可载入模块。
#-r或–remove 模块闲置不用时,即自动卸载模块。
lsmod
#lsmod 命令:用来显示文件、proc/modules的信息,也就是显示当前内核模块装载的模块。
sudo systemctl stop kubelet kube-proxy flanneld kube-apiserver kube-controller-manager kube-scheduler
sudo rm -rf ~/.kube/
sudo rm -rf /etc/kubernetes/
sudo rm -rf /usr/bin/kube*
sudo rm -rf /etc/cni
sudo rm -rf /opt/cni
sudo rm -rf /var/etcd
sudo rm -rf /var/lib/etcd
sudo rm -rf /var/lib/kubelet
sudo rm -rf /var/run/Kubernetes
sudo rm -rf /var/run/flannel/
sudo rm -rf /etc/systemd/system/{etcd,kubelet,kube-apiserver,kube-controller-manager,kube-scheduler,flanneld}.service
mount | grep '/var/lib/kubelet'| awk '{print $3}'|xargs sudo umount
sudo rm -rf /root/local/bin/{etcd,kubelet,kube-apiserver,kube-controller-manager,kube-scheduler,flanneld,mk-docker-opts.sh}
sudo yum clean all
yum remove -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0