一、环境准备
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
安装成功提示:
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 命令
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 成功
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
然后可以通过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
四、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 .....