Kubeadm搭建k8s集群

一、环境准备

1.1. 三台Centos服务器,配置2核4G,系统:CentOS 8.0.1905, 内核版本:Linux 10-9-130-183 4.18.0-147.5.1.el8_1.x86_64

1.2. 配置host信息

 // 三台主机都需要配置
 $ cat /etc/hosts
  10.9.130.183 master
  10.9.53.191 node1
  10.9.63.114 node2
// 通过ping 检测

1.3. 修改hostname,按照 /etc/hosts中配置ip对应修改主机名称,修改完成后重启机器

$ vi /etc/hostname

1.4 安装docker

## 如果存在旧版本,请删除
$  sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

## 采用 yum 方式安装
 $ yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
 $ yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
 $  yum list docker-ce --showduplicates | sort -r  // 显示可安装的版本

## 可以选择安装一个版本,比如我们这里安装最新版本:
 $ yum install docker-ce-19.03.1-3.el7
## 如果如报错:Problem: package docker-ce-3:19.03.4-3.el7.x86_64 requires containerd.io >= 1.2.2-3 
## 那就先装新版的 containerd.io
 $ dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
## 然后继续通过 yum install 安装docker

## 安装完成后,启动docker 
 $  systemctl start docker 

## 配置 Docker 镜像加速器
 $ vi /etc/docker/daemon.json  
    {
      "exec-opts": ["native.cgroupdriver=systemd"],
     "registry-mirrors" : [
      "https://ot2k4d59.mirror.aliyuncs.com/"
    ]
  } 

## 重启Docker
 $ systemctl restart docker
 $ systemctl enable docker // 开机自启动

## 测试docker 
 $ docker run hello-world

1.5 禁用防火墙

$ systemctl stop firewalld
$ systemctl disable firewalld

1.6 禁用SELINUX:

$ vi /etc/selinux/config
## 改变SELINUX的值如下:
   SELINUX=disabled

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

$ vi /etc/sysctl.d/k8s.conf
  net.bridge.bridge-nf-call-ip6tables = 1
  net.bridge.bridge-nf-call-iptables = 1
  net.ipv4.ip_forward = 1
## 执行如下命令使修改生效:
$ modprobe br_netfilter
$ sysctl -p /etc/sysctl.d/k8s.conf

1.8 安装ipvs

$ 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

上面脚本创建了的/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。
使用 lsmod | grep -e ip_vs -e nf_conntrack_ipv4 命令查看是否已经正确加载所需的内核模块。

1.9 安装ipset 以及ipvs管理工具 ipvsadm

$ yum install ipset
$ yum install ipvsadm

1.10 同步服务器时间

$ yum install chrony -y
$ systemctl enable chronyd
$ systemctl start chronyd
$ chronyc sources

$ date  # 查看时间

1.11 关闭swap 分区

$ swapoff -a 

 # 修改/etc/fstab文件,注释掉 SWAP 的自动挂载,使用free -m确认 swap 已经关闭。
 # swappiness 参数调整,修改/etc/sysctl.d/k8s.conf添加下面一行:
 vm.swappiness=0

# 执行sysctl -p /etc/sysctl.d/k8s.conf使修改生效。

1.12 通过yum 安装Kubeadm

# 方式一:如果能够科学上网,采用官网yum源进行安装
$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
        https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

# 方式二:没办法科学上网,使用阿里源进行安装:
$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 然后安装 kubeadm、kubelet、kubectl:
$ yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 查看版本
$  kubeadm version
# 设置开机自启动
$ systemctl enable kubelet.service

以上所有步骤需要在每个节点上执行

二、初始化集群

下面步骤只需要在master上执行就好
2.1. 集群初始化

# 方式一:
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=192.168.0.0/16 --kubernetes-version=v1.17.3 --apiserver-advertise-address=10.9.130.183

# 方式二:
## 通过命令导出默认初始化配置
$ kubeadm config print init-defaults > kubeadm.yaml

## 然后根据我们自己的需求修改配置,比如修改 imageRepository 的值,kube-proxy 的模式为 ipvs,
## 另外需要注意的是我们这里是准备安装 calico 网络插件的,需要将 networking.podSubnet 
## 设置为192.168.0.0/16:
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 10.9.130.183  # apiserver 节点内网IP
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: ydzs-master
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS  # dns类型
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: gcr.azk8s.cn/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.18.2  # k8s版本
networking:
  dnsDomain: cluster.local
  podSubnet: 192.168.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs  # kube-proxy 模式

# 然后使用上面的配置文件进行初始化:
$ kubeadm init --config kubeadm.yaml

安装成功提示:


image.png

2.2 拷贝 kubeconfig 文件

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

2.3 添加节点

$ kubeadm join 10.9.130.183:6443 --token 0npgi1.6bfo4c56mp9qd84h \
    --discovery-token-ca-cert-hash sha256:1845a0807b7dc33d80f8c57941a4499fb2c023413967d05845856830c6263a2e

# tips:如果忘记join 命令,可以使用 kubeadm token create --print-join-command 重新获取

2.4 执行成功后,使用 kubectl get nodes 命令


image.png

TIPS:
这里有点小变化,在k8s 1.18版本之前,集群初始化后没有安装网络插件,除了master节点外各个Node 节点的状态为Notready,而v.1.18.2使用kubeadm安装直接解决了网络问题。


针对1.18以前版本,节点为Notready 安装calico网络:

# 自由选择网络: [https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)

# 安装calico
$  wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
$ vi calico.yaml
......
spec:
  containers:
  - env:
    - name: DATASTORE_TYPE
      value: kubernetes
    - name: IP_AUTODETECTION_METHOD  # DaemonSet中添加该环境变量
      value: interface=eth0    # 指定内网网卡
    - name: WAIT_FOR_DATASTORE
      value: "true"
......
$ kubectl apply -f calico.yaml  # 安装calico网络插件

# 查看pod 状态
$ kubectl get pods -n kube-system

如下图算安装calico 成功


image.png

2.5 安装dashbaord:

$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
# tips: 如果地址失效,请到官网查看,[https://github.com/kubernetes/dashboard](https://github.com/kubernetes/dashboard)

# 修改镜像地址:
......
image: registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1 imagePullPolicy: IfNotPresent
......
# 修改Service为NodePort类型
......
selector:
  k8s-app: kubernetes-dashboard
type: NodePort

# 直接创建:
$ kubectl apply -f kubernetes-dashboard.yaml
# 查看:
$ kubectl get pods -n kube-system -l k8s-app=kubernetes-dashboard

# 查看service
$ kubectl get svc -n kube-system
image.png

然后可以通过32269端口访问,前缀记住是https,Chrome不生效可以使用Firefox测试

2.6 创建一个具有全局所有权限的用户来登录Dashboard:(admin.yaml)

$ vi admin.yaml
......
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: admin
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: admin
  namespace: kube-system

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
......
$ kubectl apply -f admin.yaml

# 查看
$ kubectl get secret -n kube-system|grep admin-token

# 获取token 令牌 登录dashboard
$ kubectl get secret admin-token-pps9t -o jsonpath={.data.token} -n kube-system |base64 -d

三、安装k8s采坑笔记

3.1 集群初始化时候出现错误:
[ERROR KubeletVersion]: the kubelet version is higher than the control plane version.

#  问题缘由:kubelete版本和k8s版本不匹配,需要重新更新kubelete版本或者k8s集群版本解决
# 解决方案:这里通过修改k8s版本解决
$ kubelet --version # 查看kubernetes版本
# 替换kubeadm init 中的 --kubernetes-version=v1.17.3 为 刚才查看到的version, 然后重新初始化

3.2 关于安装dashboard报错:

2020/05/06 05:42:27 Error while initializing connection to Kubernetes apiserver. This most likely means that the cluster is misconfigured (e.g., it has invalid apiserver certificates or service account's configuration) or the --apiserver-host param points to a server that does not exist. Reason: the server rejected our request for an unknown reason
Refer to our FAQ and wiki pages for more information: https://github.com/kubernetes/dashboard/wiki/FAQ

问题原因:
官方的yaml配置文件(https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml)中有这么一段:

#Comment the following tolerations if Dashboard must not be deployed on master
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule

使得pod不会分配到到master节点, 并且kubeadm部署的apiserver中启用的验证方式为Node和RBAC, 且关闭了insecure-port, 可能是这个原因导致连接不上apiServer, 即使是手动修改也不行--apiserver-host参数也不行

解决办法:

# 注释掉上面内容,然后添加spec手动添加调度节点,将dashboard调度到master节点上
$ vi kubernetes-dashboard.yaml
image.png

image.png

四、k8s集群维护常用命令

4.1 k8s中删除节点:

$ kubectl drain swarm1 --delete-local-data --force --ignore-daemonsets
$ kubectl delete node node1
# node1 节点执行命令
$ kubeadm reset

4.2 kubernetes处理node的命令详解(cordon、drain、delete、join node区别)

1. 主要目的:导致node处于不可调度状态,新创建的pod容器不会调度在node上。
2. cordon:将node置为SchedulingDisabled不可调度状态,后续的新创建pod容器时scheduler调度不会考虑该node旧的pod容器不会正常受影响,仍可以对外提供正常服务。(特殊情况:pod容器如果跟node绑定的话,容器下次更新就不会回到原宿主机,该情况如何处理呢?可能设置成不可调度状态就不太合适。调度器 预调度策略)
恢复调度  kubectl uncordon node
3. drain 驱逐节点:设置该node为不可调度状态, cordon驱逐node节点上pod,使其在其他节点上创建。gracefully terminate all pods
恢复调度 kubectl uncordon node
4. delete 节点:delete node后 kubernetes集群管控端获取不到node信息。master节点删除该node,失去对其控制,master不可对其恢复驱逐node上的pod容器。(如何驱赶呢?参考 https://blog.csdn.net/li_101357/article/details/89606269 ,主要是podGCcontroller来做这件事情)  疑问是:master删除node了,GC怎么删除呢?强制删除
恢复调度,需要进入node节点,重新加入集群
5. join节点: 加入节点,需要首先在master节点上获取token,然后 kubectl join .....
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355