在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应
用了很多年,Borg系统运行管理着成千上万的容器应用。
Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收
了Borg系统中的经验和教训。
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
在Kubenetes中,所有的容器均在Pod中运行,一个Pod可以承载一个或者多个相关的容器,在后边的案例中,同一个Pod中的容器会部署在同一个物理机器上并且能够共享资源。
Kubernetes的好处:
Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。下面这张图是Kubernetes的架构图。
在这张系统架构图中,我们把服务分为运行在工作节点上的服务和组成集群级别控制板的服务。
Kubernetes节点有运行应用容器必备的服务,而这些都是受Master的控制。
每次个节点上当然都要运行Docker。Docker来负责所有具体的映像下载和容器运行。
Kubernetes主要由以下几个核心组件组成:
除了核心组件,还有一些推荐的Add-ons:
首先需要搭建harbor主机,因为我们使用本地私有仓库里的镜像去做部署速度会很快,也不需要考虑其他问题
server3主机搭建了harbor仓库,可以通过浏览器直接去访问到
这里我使用了三台主机做集群
server5、server6和server7三台主机
需要给这些主机都去安装docker-ce服务,消除警告。
然后去配置docker的后台启动方式,在三台主机上都执行
[root@server5 ~]# cat > /etc/docker/daemon.json <
> {
> "exec-opts": ["native.cgroupdriver=systemd"],
> "log-driver": "json-file",
> "log-opts": {
> "max-size": "100m"
> },
> "storage-driver": "overlay2",
> "storage-opts": [
> "overlay2.override_kernel_check=true"
> ]
> }
> EOF
[root@server5 ~]# mkdir -p /etc/systemd/system/docker.service.d
[root@server5 ~]# systemctl daemon-reload
[root@server5 ~]# systemctl restart docker
可以参考官网操作文档:https://kubernetes.io/docs/setup/production-
environment/container-runtimes/#docker
下来还需要禁用集群主机上的swap分区,在server5、server6和server7操作
[root@server5 ~]# swapoff -a
[root@server5 ~]# vim /etc/fstab #注释掉swap挂载
#/dev/mapper/rhel-swap swap swap defaults 0 0
安装K8s
这里我们为了加速方便安装,使用阿里云的镜像地址去部署
部署还是在3台集群主机上
[root@server5 ~]# cat < /etc/yum.repos.d/kubernetes.repo
> [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
[root@server5 ~]# setenforce 0 #关闭selinux
[root@server5 ~]# yum install -y kubelet kubeadm kubectl #安装服务
[root@server5 ~]# systemctl enable --now kubelet.service #启动服务
下来就需要去更改配置信息,因为默认的镜像下载是从k8s.gcr.io上下载组件镜像,国外的网站我们去使用是很慢的,除非有,所以我们可以改为使用阿里云去下载,就很快了
[root@server5 ~]# kubeadm config print init-defaults
---
imageRepository: k8s.gcr.io 默认的地址
---
直接通过阿里云列出需要下载的镜像
[root@server5 ~]# kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
下载镜像
[root@server5 ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
参数: --kubernetes-version,可以指定k8s安装版本
在一台节点上下载完镜像之后,可以去上传到我们自己的私有仓库harbor里,之后需要直接从本地仓库就可以去拉取使用
操作
[root@server5 ~]# docker images #可以查看到我们下载的镜像
对这些镜像打标签,reg.test.com/library/是我要上传的harbor的主机名可库名
[root@server5 ~]# for i in `docker images |grep aliyuncs | awk '{print $1":"$2}' | awk -F / '{print $3}'`; do docker tag registry.aliyuncs.com/google_containers/$i reg.test.com/library/$i ; done
因为harbor里有https认证,所以在server5添加harbor的证书和地址解析,docker登陆认证,然后将打过标签的镜像推送到仓库里
[root@server5 ~]# for i in `docker images | grep test | awk '{print $1":"$2}'` ; do docker push $i; done
现在就可以直接从harbor仓库去拉取镜像了
初始化集群
参数:–pod-network-cidr=10.244.0.0/16,使用flannel网络组件时必须添加,因为上传了私有仓库,我们也可以用私有仓库去初始化
[root@server5 ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.test.com/library
当前面的操作成功后,就可以根据下面的指导去继续操作
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
创建用户kubeadm,为了操作方便直接给它超户的权限,切换到该用户
[kubeadm@server5 ~]$ mkdir ~/.kube
[kubeadm@server5 ~]$ sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config
[kubeadm@server5 ~]$ sudo chown $(id -u):$(id -g) ~/.kube/config
然后就可以看到集群里的节点了,目前我们只设置server5,只有它一个master’节点,状态是notready
[kubeadm@server5 ~]$ kubectl get node
NAME STATUS ROLES AGE VERSION
server5 NotReady master 19m v1.18.4
其他两台主机我们需要也来加入集群里,使用的命令在初始化时有显示
这里面要注意的是加入集群可以直接执行这个命令,但是里面的token码是有时间限制
[root@server6 ~]# kubeadm join 172.25.254.5:6443 --token fzm2k5.2rplyi23r1lacfsj \
> --discovery-token-ca-cert-hash sha256:76ccd44e9e50d09527ddd9bca75e53c8d05bed41347c22eca121b932bf536be3
可以看一下token的有效期,默认是24小时,过期就不能再使用这个token去添加信息的节点了,但是有命令可以创建新的token
[kubeadm@server5 ~]$ kubeadm token list #列出token
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
fzm2k5.2rplyi23r1lacfsj 23h 2020-06-20T14:16:25+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
[kubeadm@server5 ~]$ kubeadm token create
都添加进来之后,就都可以看到,但是状态是未准备的
[kubeadm@server5 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
server5 NotReady master 24m v1.18.4
server6 NotReady <none> 83s v1.18.4
server7 NotReady <none> 31s v1.18.4
如果无法列出,可以配置kubectl命令补齐功能,然后就可以了
[kubeadm@server5 ~]$ echo "source <(kubectl completion bash)" >> ~/.bashrc
[kubeadm@server5 ~]$ source ~/.bashrc
安装flannel网络组件:https://github.com/coreos/flannel
需要下载flannel.tar,kube-flannel.yml
导入镜像,这个镜像不能放在私有仓库,因为它的名称和kubeadm里的信息是对应的,在所有节点上都去进行安装镜像
[root@server5 ~]# docker load -i flannel.tar
所有节点都导入镜像后,在master节点执行
[root@server5 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@server5 ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7ff77c879f-27hnl 1/1 Running 1 3d1h
coredns-7ff77c879f-l4z59 1/1 Running 1 3d1h
etcd-server5 1/1 Running 3 3d1h
kube-apiserver-server5 1/1 Running 3 3d1h
kube-controller-manager-server5 1/1 Running 3 3d1h
kube-flannel-ds-amd64-dsblv 1/1 Running 2 2d23h
kube-flannel-ds-amd64-gsptr 1/1 Running 1 2d23h
kube-flannel-ds-amd64-xvrm5 1/1 Running 2 2d23h
kube-proxy-2c6gg 1/1 Running 2 3d
kube-proxy-4t2nb 1/1 Running 2 3d
kube-proxy-ctmxk 1/1 Running 3 3d1h
kube-scheduler-server5 1/1 Running 3 3d1h
[root@server5 ~]# kubectl get node #所有节点都是ready
NAME STATUS ROLES AGE VERSION
server5 Ready master 130m v1.18.4
server6 Ready <none> 107m v1.18.4
server7 Ready <none> 106m v1.18.4