1. 实验环境
主机信息 | 主机功能 |
server1(172.25.1.1) | k8s集群的master节点 |
server2(172.25.1.2) | k8s集群的worker节点1 |
server3(172.25.1.3) | k8s集群的worker节点2 |
在server1、server2、server3上面安装docker服务,并且开启
记住:前提是装好docker的主机,保证实验环境干干净净
2.部署一个基本的k8s集群
master节点环境的安装
(1)配置yum仓库
先安装docker镜像,去阿里云官方镜像网站:https://opsx.alibaba.com/mirror
找到docker-ce对应的linux centos系统repo配置文件,右击复制链接
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
接着再生成Kubernetes的仓库文件,创建并编辑kubernetes.repo。
[root@server1 yum.repos.d]# vim kubernetes.repo
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
enabled=1
写入以下内容,baseurl和gpgkey的路径可在阿里云官方镜像网站Kubernetes目录下找到。
创建完之后,获取当前系统有效的repolist
[root@serve1 yum.repos.d]# yum repolist
为了方便在node节点上安装,可以将这个两个配置文件通过scp命令复制到node节点服务器(server1,server2)上
[root@server1 yum.repos.d]# scp kubernetes.repo server2:/etc/yum.repos.d/
[root@server1 yum.repos.d]# scp kubernetes.repo server3:/etc/yum.repos.d/
(2)安装各组件
kuberctl:API Server的命令行客户端
[root@server1 yum.repos.d]# yum install kubelet kubeadm kubectl
可以看到加载到的是哪些版本的包
安装报错:
解决方法:
将yum-key.gpg,rpm包的key下载到本地进行rpm --import导入
wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
rpm --import yum-key.gpg
rpm --import rpm-package-key.gpg
最后,就能安装成功
启动kubelet
此时,还不能启动kubelet,因为此时配置还不能,现在仅仅可以设置开机自启动
systemctl enable --now kubelet
同时还要确保以下两个参数值为1。通过网桥转发的IP数据包会iptables规则过滤,而这两个选项将阻止过滤,Netfilter是默认情况下启用了桥梁,如果不阻止会导致严重的混乱
如果不是1需要修改为1
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
通过
[root@server1 ~]# rpm -ql kubelet #命令查看都安装了什么文件
需要禁止各个节点启用swap,如果启用了swap,那么kubelet就无法启动
[root@server1 ~]# swapoff -a && sysctl -w vm.swappiness=0
vm.swappiness = 0
[root@server1 ~]# free -m
total used free shared buff/cache available
Mem: 769 305 104 5 359 312
Swap: 0 0 0
之后更改/etc/fstab文件将swap那一行注释掉即可实现永久关闭。
将docker的cgroup驱动更改为systemd
更改docker的daemon文件
[root@server1 ~]# vim /etc/docker/daemon.json
[root@server1 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://ioeo57w5.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
之后重启docker:
systemctl daemon-reload
systemctl restart docker
每个节点都需要设置:
[root@server1 docker]# scp daemon.json server2:/etc/docker/
daemon.json 100% 287 328.6KB/s 00:00
[root@server1 docker]# scp daemon.json server3:/etc/docker/
daemon.json 100% 287 300.0KB/s 00:00
(3)kubeadm init初始化
查看kubeadm init的帮助信息
[root@server1 ~]# kubeadm init --help
--image-repository string
:这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是,我们将其指定为国内镜像地址:/google_containers,也可以先将镜像下载下来放到私有仓库直接从私有仓库拉取。
--kubernetes-version string
:指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(最新版:v1.18.1)来跳过网络请求。
--apiserver-advertise-address
指明用 Master 的哪个 interface 与 Cluster
的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的interface。
--pod-network-cidr
指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。
[root@server1 ~]# kubeadm init --image-repository /google_containers --kubernetes-version v1.18.1 --pod-network-cidr=10.244.0.0/16
报错至少需要2核cpu
关机,添加CPU内核,再次执行
看到下面的输出就表示你的集群创建成功了:
......
Your Kubernetes control-plane has initialized successfully!
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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 172.25.1.1:6443 --token cmpyar.n4arbbq0i9irhmum \
--discovery-token-ca-cert-hash sha256:542e77bad47c73c3336ce601ad9fe2078381ea8b04b95f377f46520296a79fe2
成功后注意最后一个命令,这个join命令可以用来添加节点。
如果初始化失败,请使用如下代码清除后重新初始化
kubeadm reset
配置kubectl
kubectl 是管理 Kubernetes Cluster 的命令行工具,前面我们已经在所有的节点安装了 kubectl。Master 初始化完成后需要做一些配置工作,然后 kubectl 就能使用了。
[root@server1 ~]# mkdir -p $HOME/.kube
[root@server1 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@server1 ~]# chown $(id -u):$(id -g) $HOME/.kube/config
为了使用更便捷,启用 kubectl 命令的自动补全功能。
[root@server1 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
现在kubectl可以使用了
[root@server1 ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
controller-manager Healthy ok
第四步:安装pod网络
要让 Kubernetes Cluster 能够工作,必须安装 Pod 网络,否则 Pod 之间无法通信。
Kubernetes 支持多种网络方案,这里我们先使用 flannel,后面还会讨论 Canal。
[root@server1 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
每个节点启动kubelet
systemctl restart kubelet
等镜像下载完成以后,看到node的状态是ready了
[root@server1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
server1 Ready master 18m v1.18.1
此时,就可以看到pod信息了
[root@server1 ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7ff77c879f-8gzr5 1/1 Running 0 18m
coredns-7ff77c879f-dxst6 1/1 Running 0 18m
etcd-server1 1/1 Running 1 18m
kube-apiserver-server1 1/1 Running 1 18m
kube-controller-manager-server1 1/1 Running 4 18m
kube-flannel-ds-amd64-wcqrh 1/1 Running 0 8m36s
kube-proxy-lzdn8 1/1 Running 0 18m
kube-scheduler-server1 1/1 Running 4 18m
添加 node1 和 node2
第一步:环境准备
实验的准备之前都完成了
node节点关闭防火墙和selinux
禁用swap
解析主机名
启动内核功能
启动kubelet
只需要设置为开机自启动就可以了
systemctl enable kubelet
第二步:添加nodes
这里的–token 来自前面kubeadm init输出提示,如果当时没有记录下来可以通过kubeadm token list 查看。
在需要添加的节点运行:
kubeadm join 172.25.1.2:6443 --token rn816q.zj0crlasganmrzsr --discovery-token-ca-cert-hash sha256:e339e4dbf6bd1323c13e794760fff3cbeb7a3f6f42b71d4cb3cffdde72179903
第三步:查看nodes
根据上面最后一行的输出信息提示查看nodes
[root@server1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
server1 Ready master 38m v1.18.1
server2 NotReady <none> 2m41s v1.18.1
server3 NotReady <none> 2m10s v1.18.1
这里其实需要等一会,这个server2 server3节点才会变成Ready状态,因为node节点需要下载四个镜像flannel coredns kube-proxy pause
过了一会查看节点状态
[root@server1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
server1 Ready master 47m v1.18.1
server2 Ready <none> 11m v1.18.1
server3 Ready <none> 11m v1.18.1
补充:移除NODE节点的方法
第一步:先将节点设置为维护模式(server2是节点名称)
[root@server1 ~]# kubectl drain server2 --delete-local-data --force --ignore-daemonsets
第二步:然后删除节点
[root@server1 ~]# kubectl delete node server2
第三步:查看节点
发现server2节点已经被删除了
[root@server1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
server1 Ready master 47m v1.18.1
server3 Ready <none> 11m v1.18.1
添加已删除节点
如果这个时候再想添加进来这个node,需要执行两步操作
第一步:停掉kubelet(需要添加进来的节点操作)
[root@server2 ~]# systemctl stop kubelet
第二步:删除相关文件
[root@server2 ~]# rm -rf /etc/kubernetes/*
第三步:添加节点
[root@server2 ~]# kubeadm join 172.25.63.1:6443 --token cmpyar.n4arbbq0i9irhmum --discovery-token-ca-cert-hash sha256:542e77bad47c73c3336ce601ad9fe2078381ea8b04b95f377f46520296a79fe2
第四步:查看节点
kubectl get nodes
[root@server1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
server1 Ready master 47m v1.18.1
server2 Ready <none> 11m v1.18.1
server3 Ready <none> 11m v1.18.1
忘掉token再次添加进k8s集群
第一步:主节点执行命令
在主控节点,获取token:
[root@server1 ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
cmpyar.n4arbbq0i9irhmum 23h 2020-04-18T20:47:06+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
第二步: 获取ca证书sha256编码hash值
在主控节点
[root@server1 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
542e77bad47c73c3336ce601ad9fe2078381ea8b04b95f377f46520296a79fe2
第三步:从节点执行如下的命令
[root@server2 ~]# systemctl stop kubelet
第四步:删除相关文件
[root@server2 ~]# rm -rf /etc/kubernetes/*
第五步:加入集群
指定主节点IP,端口是6443
在生成的证书前有sha256:
[root@server2 ~]# kubeadm join 172.25.63.1:6443 --token cmpyar.n4arbbq0i9irhmum --discovery-token-ca-cert-hash sha256:542e77bad47c73c3336ce601ad9fe2078381ea8b04b95f377f46520296a79fe2