原文

一、安装要求

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

#下面是修改之前的时区:

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_DNS


#修改之后正确的显示如下:

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_DNS_02

三、安装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

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_运维_03


#四、用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"

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_docker_04


#另外再添加一个字段,把默认的调度方式改为ipvs模式(最后scheduler: {}下面)

---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_初始化_05

_ 初始化安装并自动颁发证书 _

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

__ 初始化执行结果如下: __

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_DNS_06


__ 根据提示操作: __

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网络):

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_初始化_07

_ 部署网络-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

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_运维_08


创建完成后查看pod的状态如下(原因可能是是网络差创建flannel的时候有一个pull flannel镜像的过程,等两分钟即可):

kubectl get pod -n kube-system

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_kubernetes_09


#-n 后面指定的名称空间,默认k8s的所有系统主键都默认安装在kebe-system的名称空间下,如果不加-n namespace则默认使用default的名称空间

等两分钟之后pod状态变成Running,并会多了一个flannel镜像

#如果一直报错可以查看日志信息(注意指定名称空间参数–namespace=):

#kubectl describe --namespace=kube-system pod kube-flannel-ds-amd64-vfbvb

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_初始化_10


内置的 kubernetes service可以改为nodeport吗 kubernetes配置_kubernetes_11


再查看node节点状态已经变成“ready”

#运行正常后,flanneld 会在宿主机的/etc/cni/net.d 目录下生成自已的配置文件,kubelet 将会调用它。 网络插件运行成功后,Node 状态才 Ready

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_初始化_12


同时使用ifconfig命令可以看到多加了一块flannel.1的网卡

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_DNS_13

flannel详解:

  1. flannel 默认就是 VXLAN 模式,即 Overlay Network(全覆盖网络)。
  2. flanneld 创建了一个 flannel.1 接口,它是专门用来封装隧道协议的,默认分给集群的 Pod 网段为 10.244.0.0/16。
  3. 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初始化的时候最后打印出如下信息,明显告诉你子节点要加入工作的话需要的执行如下命令

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_docker_14


#分别在两个 Node 节点执行

kubeadm join 10.12.237.17:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1bc56d762687199cadade6c5a9f8f4224f6b94f875081a630e3fab84c42ae19f

#两台node节点执行结果如下图:

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_docker_15


同样node节点加入集群后也会生成一个flannel.1网桥设备

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_初始化_16


内置的 kubernetes service可以改为nodeport吗 kubernetes配置_运维_17


回到主节点再查看node发现一台变成三台并且从notready变成ready。

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_初始化_18


master节点详细查看集群原始pod分布情况

kubectl get pod -n kube-system -o wide

#-o wide:查看详细信息

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_kubernetes_19


最后查看集群健康状态:

kubectl get cs

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_DNS_20


#默认情况下集群部署完成后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起来了

内置的 kubernetes service可以改为nodeport吗 kubernetes配置_运维_21

#卸载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