虚拟机基于Docker容器部署Master节点(Kubernetes)K8s集群服务
kubenetes入门教程,帮你不再跳坑。从0在虚拟机搭建自己的K8s集群,这里有详细的部署经验,欢迎转发阅读
文章目录
前言
本例基于有一定docker基础使用,如有任何问题请联系我,公众号【IT散记】重点介绍:详细的部署流程,其中的一些坑以及如何利用镜像仓库构建国外源的镜像,
安装集群可视化Dashboard,添加节点,内容丰富!
以下为正文,有遇到其他问题,请留言讨论
一、基础环境
操作系统:centos 7.0+ /Redhat 7.0+
虚拟机推荐 内存>=2GB
二、部署步骤
1.定义hostname
代码如下:
hostname k8s-master
//节点之中不可以有重复的主机名
2.编辑 /etc/hosts
代码如下:
vi /etc/hosts
#当然我们在这⾥根据实际情况指定⾃⼰的ip地址即可
192.168.2.2 k8s-master
3.修改其他配置等操作
关闭防火墙:
$ systemctl stop firewalld
$ systemctl disable firewalld
$ iptables -F
关闭selinux:
$ sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
$ sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config
$ setenforce 0
$ cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
关闭swap:
$ swapoff -a $ 临时
$ vim /etc/fstab $ 永久
$ sed -i 's/.*swap.*/#&/' /etc/fstab
cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Mar 4 17:23:04 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=3dd5660e-0905-4f1e-9fa3-9ce664d6eb94 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
#/dev/mapper/centos-swap swap swap defaults 0 0
将桥接的IPv4流量传递到iptables的链:
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sysctl --system
修改文件句柄限制
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
echo "* soft nproc 65536" >> /etc/security/limits.conf
echo "* hard nproc 65536" >> /etc/security/limits.conf
echo "* soft memlock unlimited" >> /etc/security/limits.conf
echo "* hard memlock unlimited" >> /etc/security/limits.conf
4.所有节点安装Docker/kubeadm/kubelet
Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。
(1)安装Docker
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
$ yum -y install docker-ce-18.06.1.ce-3.el7
$ systemctl enable docker && systemctl start docker
$ docker --version
Docker version 18.06.1-ce, build e68fc7a
(2)添加yum软件源
$ 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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
导入gpgkey文件
$ wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
$ rpm --import yum-key.gpg
$ wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
$ rpm --import rpm-package-key.gpg
(3)yum安装kubeadm/kubelet/kubectl
# yum install -y docker kubelet kubeadm kubectl --disableexcludes=kubernetes
提示:可以自行指定版本,否则默认最新,示例:
$ yum install -y kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3 kubernetes-cni-0.6.0
$ systemctl enable kubelet
5.部署Kubernetes Master
我们事先可以通过如下命令查看所依赖的docker镜像版本kubeadm config images list
,然后通过国内镜像仓库下载所需的镜像文件。
由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
注意:在这里的版本号⼀一定要先通过上述命令查看后在填写,本例中的是v1.19.0后续可能版本会有 变化,因为国内的源随时可能更新k8s的版本
6.构建我们自己的 Docker 镜像(不怕被墙)
主要使用阿里云提供的 “容器镜像服务”,它不但提供了镜像的托管能力,还提供了国内外镜像构建服务,而且还免费。
注意,接下来讲的跟阿里云提供的 “容器镜像加速” 不是同一个东西,加速是解决速度慢的问题,前提是能访问。下面讲一下在国内由于不可描述的原因根本无法访问的镜像(比如 k8s.gcr.io/kube-···)。
第一步:在 GitHub 上创建代码仓库
点击这里参考
https://github.com/DonkeyL/docker-image-wrapper(可直接Fork)
//举例Dockerfile
FROM k8s.gcr.io/kube-apiserver:v1.19.0
MAINTAINER yourname <yourname@example.com>
第二步:阿里云创建镜像仓库
凡人
2.1 创建命名空间
创建一个命名空间,“默认仓库类型” 公有 或 私有 都可以。我这里是 私有。
2.2 创建镜像仓库
创建一个镜像仓库,地域选择离自己近的,命名空间选择上面创建的 ,仓库名称为 kube-apiserver,仓库类型任意(我这选择公开),如图:
点击『下一步』,开始关联代码仓库,这里选择 GitHub,关联第一步在 GitHub 上创建的代码仓库:
可以看到,除了 GitHub ,还有很多其它的选项,如果 GitHub 访问也吃力的话,可以选择其它的类型。
勾选『海外机器构建』,第一个自动构建镜像勾不勾选都可以,后面配置构建策略的时候可以更改。
然后点击『创建镜像仓库』
2.3 添加构建规则
这一步是配置构建规则,比如分支名、Dockerfile 路径等信息,进入构建页面,点击『添加规则』,如图:
添加一条构建规则,如图:
如上,内容可根据情况自行修改。
2.4 构建镜像
创建完构建规则后,点击『立即构建』,如图:
等待构建成功即可。到此构建完成
2.5 获取镜像
镜像构建完成了,开始获取镜像,如图:
注意,第一步 docker login 的时候,需要输入的密码并不是阿里云的登录密码,而是这里单独设置的:
在自己主机将将镜像pull下来之后,按照要求进行tag
//举例,要按照步骤五的图片中示例将镜像tag
# docker tag registry.cn-hangzhou.aliyuncs.com/docker-self/kube-apiserver k8s.gcr.io/kube-apiserver:v1.19.0
# docker tag registry.cn-hangzhou.aliyuncs.com/docker-self/pause k8s.gcr.io/pause:3.2
...
...
//可删除原来的镜像
# docker image rm registry.cn-hangzhou.aliyuncs.com/docker-self/kube-apiserver/kube-apiserver
...
同理可获取任何国外源镜像,速度还是可以的。比如我就通过这种方式构建了 K8s 集群的所有镜像,如图:
7.初始化Master环境
$ kubeadm init \
--kubernetes-version v1.19.0 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=NumCPU
当运行成功后会出现的提示信息,我们注意以下几点
根据提示信息我们可以运行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
记录秘钥,添加节点使用
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.2.2:6443 --token er6af9.i52gp9isqe0pzakl \
--discovery-token-ca-cert-hash sha256:e3700a8367647daab4331bd19bcbcb938629844d570c817fca0881cd35a41a74
8.按需开启master创建pod的功能
kubectl taint nodes --all node-role.kubernetes.io/master-
默认情况出于安全考虑 master节点是不允许创建pod的,我们可以通过如上命令开启此功能
9.安装网络插件
$ iptables -P FORWARD ACCEPT
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
flannel或者calico均可,镜像都可以自己通过阿里云下到本地再执行以上命令
10.大功告成
当所有运行完成后 我们可以通过
kubectl get pods --all-namespaces
来查看pod的运⾏行行状态,当所有为run的状态时,证明启动完毕。
都进行到这了,不妨安个dashboard再走吧
二、K8S集群可视化管理
1.查看pod运行情况
如果你的结果和我的一样,那么证明集群启动成功。
接下来进行页面dashboard安装。
2.下载recommended.yaml文件
# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
提示:这里的地址不唯一(版本差别),但是接下来的教程大同小异,可放心食用
或者从https://github.com/kubernetes/dashboard/releases上边找到和自己安装的k8s相对于的dashboard的版本,再下载其recommended.yaml
Next,cat查看下载的文件,获取里面所需的镜像版本,通过阿里云构建使用。
3.构建页面化dashboard所需镜像
我这里通过yaml文件获取到需要下载的镜像为:
image: kubernetesui/metrics-scraper:v1.0.4
#在新版的K8S中,系统资源的采集均使用Metrics-Server服务,可以通过Metrics-Server服务采集节点和Pod的内存、磁盘、CPU和网络的使用率等信息。
image: kubernetesui/dashboard:v2.0.0
提示:解决方式不唯一,可以替换国内镜像源(简单),也可以自己构建国外镜像(实用)。
接下来就是通过上文介绍方式自行构建镜像,可参照我的github以及上文构建教程。[戳我]
(https://github.com/DonkeyL/docker-image-wrapper)
4.修改recommended.yaml文件
vim 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: 30000 #增加
selector:
k8s-app: kubernetes-dashboard
---
#因为自动生成的证书很多浏览器无法使用,所以我们自己创建,注释掉kubernetes-dashboard-certs对象声明
#apiVersion: v1
#kind: Secret
#metadata:
# labels:
# k8s-app: kubernetes-dashboard
# name: kubernetes-dashboard-certs
# namespace: kubernetes-dashboard
#type: Opaque
---
5.创建证书
mkdir dashboard-certs
cd dashboard-certs/
#创建命名空间
kubectl create namespace kubernetes-dashboard
# 创建key文件
openssl genrsa -out dashboard.key 2048
#证书请求
openssl req -days 36000 -new -out dashboard.csr -key dashboard.key -subj '/CN=dashboard-cert'
#自签证书
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
#创建kubernetes-dashboard-certs对象
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard
6.安装dashboard
kubectl create -f ~/recommended.yaml
注意:这里可能会报如下所示。
Error from server (AlreadyExists): error when creating "./recommended.yaml": namespaces "kubernetes-dashboard" already exists
这是因为我们在创建证书时,已经创建了kubernetes-dashboard命名空间,所以,直接忽略此错误信息即可。
7.查看安装结果
8.创建dashboard管理员
创建dashboard-admin.yaml文件。
vim dashboard-admin.yaml
文件的内容如下所示。
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: dashboard-admin
namespace: kubernetes-dashboard
保存退出后执行如下命令创建管理员。
kubectl create -f ./dashboard-admin.yaml
9.为用户分配权限
创建dashboard-admin-bind-cluster-role.yaml文件。
vim dashboard-admin-bind-cluster-role.yaml
文件内容如下所示。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dashboard-admin-bind-cluster-role
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kubernetes-dashboard
保存退出后执行如下命令为用户分配权限。
kubectl create -f ./dashboard-admin-bind-cluster-role.yaml
10.查看并复制用户Token
在命令行执行如下命令。
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')
具体执行情况如下所示。
[root@~]# kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')
Name: dashboard-admin-token-p8tng
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: kubernetes.io/service-account.name: dashboard-admin
kubernetes.io/service-account.uid: c3640b5f-cd92-468c-ba01-c886290c41ca
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 20 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IlVsRVBqTG5RNC1oTlpDS2xMRXF2cFIxWm44ZXhWeXlBRG5SdXpmQXpDdWcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcDh0bmciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYzM2NDBiNWYtY2Q5Mi00NjhjLWJhMDEtYzg4NjI5MGM0MWNhIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.XOrXofgbk5EDa8COxOkv31mYwciUGXcBD9TQrb6QTOfT2W4eEpAAZUzKYzSmxLeHMqvu_IUIUF2mU5Lt6wN3L93C2NLfV9jqaopfq0Q5GjgWNgGRZAgsuz5W3v_ntlKz0_VW3a7ix3QQSrEWLBF6YUPrzl8p3r8OVWpDUndjx-OXEw5pcYQLH1edy-tpQ6Bc8S1BnK-d4Zf-ZuBeH0X6orZKhdSWhj9WQDJUx6DBpjx9DUc9XecJY440HVti5hmaGyfd8v0ofgtdsSE7q1iizm-MffJpcp4PGnUU3hy1J-XIP0M-8SpAyg2Pu_-mQvFfoMxIPEEzpOrckfC1grlZ3g
可以看到,此时的Token值为:
eyJhbGciOiJSUzI1NiIsImtpZCI6IlVsRVBqTG5RNC1oTlpDS2xMRXF2cFIxWm44ZXhWeXlBRG5SdXpmQXpDdWcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcDh0bmciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYzM2NDBiNWYtY2Q5Mi00NjhjLWJhMDEtYzg4NjI5MGM0MWNhIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.XOrXofgbk5EDa8COxOkv31mYwciUGXcBD9TQrb6QTOfT2W4eEpAAZUzKYzSmxLeHMqvu_IUIUF2mU5Lt6wN3L93C2NLfV9jqaopfq0Q5GjgWNgGRZAgsuz5W3v_ntlKz0_VW3a7ix3QQSrEWLBF6YUPrzl8p3r8OVWpDUndjx-OXEw5pcYQLH1edy-tpQ6Bc8S1BnK-d4Zf-ZuBeH0X6orZKhdSWhj9WQDJUx6DBpjx9DUc9XecJY440HVti5hmaGyfd8v0ofgtdsSE7q1iizm-MffJpcp4PGnUU3hy1J-XIP0M-8SpAyg2Pu_-mQvFfoMxIPEEzpOrckfC1grlZ3g
查看dashboard界面
在浏览器中打开链接 https://192.168.2.2:30000 ,如下所示。
这里,我们选择Token方式登录,并输入在命令行获取到的Token,到此,k8s的dashboard就安装完了,我们就可以愉快的通过图形界面进行操作了。
问题示例(爬坑)
1,问题描述
(1)在安装配置好 Kubernetes 后,正常情况下服务器关机重启,kubelet 也会自动启动的。但最近配置的一台服务器重启后,输入命令 kubectl get nodes 查看节点报如下错误:
The connection to the server 192.168.2.2:6443 was refused - did you specify the right host or port?
(2)输入 systemctl status kubelet 命令查看 kubelet 的情况,发现 kubelet 确实没有启动:
[root@k8s-master /]# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
Drop-In: /usr/lib/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: activating (auto-restart) (Result: exit-code) since Wed 2020-09-16 11:00:11 CST; 4s ago
Docs: https://kubernetes.io/docs/
Process: 18387 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=255)
Main PID: 18387 (code=exited, status=255)
Sep 16 11:00:11 k8s-master kubelet[18387]: goroutine 106 [runnable]:
Sep 16 11:00:11 k8s-master kubelet[18387]: k8s.io/kubernetes/vendor/k8s.io/client-go/tools/record.(*eventBroadcasterImpl).S...5d230)
Sep 16 11:00:11 k8s-master kubelet[18387]: /workspace/anago-v1.19.0-rc.4.197+594f888e19d8da/src/k8s.io/kubernetes/_output/d...go:299
Sep 16 11:00:11 k8s-master kubelet[18387]: created by k8s.io/kubernetes/vendor/k8s.io/client-go/tools/record.(*eventBroadca...atcher
Sep 16 11:00:11 k8s-master kubelet[18387]: /workspace/anago-v1.19.0-rc.4.197+594f888e19d8da/src/k8s.io/kubernetes/_output/d... +0x6e
Sep 16 11:00:11 k8s-master kubelet[18387]: goroutine 107 [runnable]:
Sep 16 11:00:11 k8s-master kubelet[18387]: k8s.io/kubernetes/vendor/k8s.io/client-go/tools/record.(*eventBroadcasterImpl).S...b23c0)
Sep 16 11:00:11 k8s-master kubelet[18387]: /workspace/anago-v1.19.0-rc.4.197+594f888e19d8da/src/k8s.io/kubernetes/_output/d...go:299
Sep 16 11:00:11 k8s-master kubelet[18387]: created by k8s.io/kubernetes/vendor/k8s.io/client-go/tools/record.(*eventBroadca...atcher
Sep 16 11:00:11 k8s-master kubelet[18387]: /workspace/anago-v1.19.0-rc.4.197+594f888e19d8da/src/k8s.io/kubernetes/_output/d... +0x6e
Hint: Some lines were ellipsized, use -l to show in full.
2,问题原因
由于 K8s 必须保持全程关闭交换内存,之前我安装是只是使用 swapoff -a 命令暂时关闭 swap。而机器重启后,swap 还是会自动启用,从而导致 kubelet 无法启动。
3,解决办法
(1)首先执行如下命令关闭 swap。
swapoff -a
(2)接着编辑 /etc/fstab 文件。
vi /etc/fstab
(3)将 /dev/mapper/centos-swap swap swap default 0 0 这一行前面加个 # 号将其注释掉。
(4) 编辑完毕后保存退出。这样机器重启后 kubelet 也可以正常自动启动了。
总结
坑很多!很多!多!
添加集群节点、创建应用、pod与pvc等等知识后面再聊。
以上内容只是入门教程,有什么问题请留言讨论,欢迎指点,希望帮助到更多的人。有一些坑因为篇幅过长,我会单写解决的文章。
更多入门到进阶知识,请关注我公众号【IT散记】
更多推荐
所有评论(0)