参考教程:https://blog.csdn.net/weixin_57250068/article/details/123368726
https://blog.csdn.net/kity9420/article/details/123674582
1.系统准备
我用了两台虚拟机,一个作为云(master),一个作为端(slave)。
1.1 修改主机名及映射(全部节点)
vi /etc/hostname
vi 的使用:i 键进入编辑模式,esc退出编辑模式,输入“:q!“不保存强制退出,输入“:wq”,保存退出vim参考链接
master主机从ubuntu改为master,slave同理
查看ip地址
ifconfig
修改映射,在最后添加ip地址和主机名
vi /etc/hosts
其他参考:关于IP地址与主机名映射的/etc/hosts文件配置
1.2 配置免密登录(SSH)
先看有没有安装sshd服务
ps -e |grep ssh
如果输入命令后只显示了一个ssh,则说明你没有安装sshd服务。
安装ssh:
sudo apt-get install openssh-server
在用户主目录下,进入.ssh文件夹
cd ~
cd .ssh
若是没有ssh文件(有则跳过这一步)
输入ssh localhost命令,第三个红框输入密码
现在有了ssh文件,生成密钥,输入
ssh-keygen -t rsa
发放其他主机,输入
ssh-copy-id 主机名(我的master主机对应slave)
验证:ssh slave,可以看到master主机可以登录到slave主机上
参考链接:ssh: connect to host localhost port 22: Connection refused的解决方案
1.3 关闭 swap 内存
执行如下命令关闭swap内存
sudo swapoff -a
安装docker
安装
sudo apt install docker.io
查看安装是否成功/查看docker版本
docker --version
配置
kubernetes默认设置cgroup驱动(cgroupdriver)为"systemd",而docker服务的cgroup驱动默认为"cgroupfs",建议将其修改为"systemd",与kubernetes保持一致,可以通过修改docker的/etc/docker/daemon.js文件进行设置
mkdir /etc/docker 或者 cd /etc/docker/
cat <<EOF> /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
启动Docker服务并激活开机启动:
systemctl start docker
systemctl enable docker
3 安装kubeadm、kubectl以及kubelet
安装完了 docker 就可以下载 k8s 的三个主要组件kubelet、kubeadm以及kubectl。这一步两台主机都需要进行安装。先来简单介绍一下这三者
kubelet: k8s 的核心服务
kubeadm: 这个是用于快速安装 k8s 的一个集成工具,我们在master1和worker1上的 k8s 部署都将使用它来完成。
kubectl: k8s 的命令行工具,部署完成之后后续的操作都要用它来执行
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
添加 k8s 镜像源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
更新源列表
apt-get update
安装kubectl,kubeadm以及 kubelet
apt-get install kubelet=1.18.0-00 kubeadm=1.18.0-00 kubectl=1.18.0-00
下载镜像
查询需要下载的镜像
kubeadm config images list --kubernetes-version v1.18.0
下载镜像
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
复制改名(可以跳过)
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.0 k8s.gcr.io/kube-apiserver:v1.18.0
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.0 k8s.gcr.io/kube-controller-manager:v1.18.0
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.0 k8s.gcr.io/kube-scheduler:v1.18.0
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.18.0 k8s.gcr.io/kube-proxy:v1.18.0
docker tag registry.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag registry.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag registry.aliyuncs.com/google_containers/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7
删除多余镜像(要是上一个没做,这个必须跳过)
docker rmi registry.aliyuncs.com/google_containers/etcd:3.4.3-0
docker rmi registry.aliyuncs.com/google_containers/coredns:1.6.7
docker rmi registry.aliyuncs.com/google_containers/pause:3.2
docker rmi registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/kube-proxy:v1.18.20
下载完成后,通过docker images就可以在本地查看镜像
docker images
配置云节点
kubeadm init --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=192.168.0.0/16 --kubernetes-version=v1.18.0
配置项说明:
- –apiserver-advertise-address k8s 中服务apiserver的部署地址,如果不填写,默认是本机
- –image-repository 拉取的 docker 镜像源,因为初始化的时候kubeadm会去拉 k8s 的很多组件来进行部署,所以需要指定国内镜像源,下不然会拉取不到镜像
- –pod-network-cidr k8s 采用的节点网络,因为我们将要使用flannel作为 k8s 的网络,所以这里填192.168.0.0/16就好(因为我的master IP地址是192.168.XXX.XXX,ifconfig命令查看ip)
- –kubernetes-version: 这个是用来指定你要部署的 k8s 版本的,一般不用填,不过如果初始化过程中出现了因为版本不对导致的安装错误的话,可以用这个参数手动指定
安装需要一会,等待成功后,在最后会看到如下信息
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 192.168.62.129:6443 --token paua0a.yeygd3v81lovxn2a \
--discovery-token-ca-cert-hash sha256:e146ea71fa645698e4da8370ab34ee52fefc5fb7d4fa082b168ec93465607356
其中,最后两行消息十分重要
设置配置文件如下
mkdir -p /root/.kube
cp -i /etc/kubernetes/admin.conf /root/.kube/config
chown root:root /root/.kube/config
如果忘记token,则用如下命令查看
kubeadm token list
加入端节点
在子节点执行 kubeadm init 初始化的命令
kubeadm init
若出现端口被占用等问题,重置
kubeadm reset
加入集群,输入云节点的最后两行
kubeadm join 192.168.62.129:6443 --token paua0a.yeygd3v81lovxn2a \
--discovery-token-ca-cert-hash sha256:e146ea71fa645698e4da8370ab34ee52fefc5fb7d4fa082b168ec93465607356
设置完成后,可以使用kubectl命令行工具对kubernetes集群进行访问和操作了
# 查看已加入的节点
kubectl get nodes
# 查看集群状态
kubectl get cs
部署网络,自动拥有flanner网络服务
可以看到上面的master和slave都是NotReady状态,为了让它Ready,安装Pod网络插件(一般都是CNI)
Pod的网络插件有很多种,参见官方文档。本文选择部署Flannel网络插件,让Pod内部服务之间可以相互通讯。在master上
第一种,可以直接安装的办法
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
第二种,如果上一步如果卡住, 可以把文件下载到本地
然后在下载的文件夹下执行(root执行)
kubectl apply -f kube-flannel.yml
执行结果:
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
再次查看已加入节点
kubectl get node
安装Dashboard插件
上面所有的操作,我们都是通过命令行来执行的,对整个集群没有一个整体的认识,操作起来也不便利。此时,我们需要一个可视化的操作界面,来改善这个问题:Dashboard插件。
Kubernetes Dashboard 是用于 Kubernetes 集群的通用、基于 Web 的 UI。 它允许用户管理集群中运行的应用程序并对其进行故障排除,以及管理集群本身。它需要去master节点上安装。
跟上面一样,如果可以直接下载
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
不能直接下载就先用能联网的机器下载,然后发送到需要安装的机器上
这里我们多做一步:由于默认Dashboard只能集群内部访问,使用默认配置安装的dashboard插件,只允许我们通过集群local master主机的浏览器来访问集群的UI,对我们来说太不方便了。因此修改Service为NodePort类型,让UI暴露到集群外部可以访问
vi recommended.yaml 或者 gedit recommended.yaml
添加两行配置
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort ---- 添加一行
ports:
- port: 443
targetPort: 8443
nodePort: 30001 ---- 添加一行
selector:
k8s-app: kubernetes-dashboard
再次安装
kubectl apply -f recommended.yaml
查看pod中是否有dashboard
kubectl get pods --all-namespaces
最下面两行,dashbaord有了。查看dashboard信息
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7ff77c879f-vh6qr 0/1 ContainerCreating 0 36m
kube-system coredns-7ff77c879f-xx4qr 0/1 ContainerCreating 0 36m
kube-system etcd-master 1/1 Running 0 36m
kube-system kube-apiserver-master 1/1 Running 0 36m
kube-system kube-controller-manager-master 1/1 Running 0 36m
kube-system kube-flannel-ds-szg68 0/1 CrashLoopBackOff 6 6m48s
kube-system kube-flannel-ds-v4fqm 0/1 CrashLoopBackOff 6 6m48s
kube-system kube-proxy-wcnn7 1/1 Running 0 23m
kube-system kube-proxy-zxm6d 1/1 Running 0 36m
kube-system kube-scheduler-master 1/1 Running 0 36m
kubernetes-dashboard dashboard-metrics-scraper-55bc59dffc-8rwvx 0/1 ContainerCreating 0 6m12s
kubernetes-dashboard kubernetes-dashboard-5c6dff6c6f-s8hbz 0/1 ContainerCreating 0 6m12s