一、Kubernetes简介
kubernetes,简称 K8s,是用 8 代替 8 个字符“ubernete”而成的缩写。是一个开源 的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的 应用简单并且高效(powerful),Kubernetes 提供了应用部署,规划,更新,维护的一种机制。
在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年,Borg系统运行管理着成千上万的容器应用。
Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统中的经验和教训。
Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交给用户。Kubernetes的好处:
- 隐藏资源管理和错误处理,用户仅需要关注应用的开发。
- 服务高可用、高可靠。
- 可将负载运行在由成千上万的机器联合而成的集群中。
Kubernetes的核心组件:
核心组件名称 | 含义 |
etcd | 保存了整个集群的状态,一般把所有的集群信息都存放到etcd当中,etcd不属于Kubernetes的某一个部分,而是单独集群部署的,apiserver是它唯一的入口,可以直接访问etcd。 |
apiServer | 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制 |
Controller Manager | 是一个控制器,负责维护集群的状态,比如Pod的故障检测、自动扩展、滚动更新等 |
Scheduler | 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上 |
Kubelet | 负责维护容器的生命周期,apiserver创建Pod,Scheduler将Pod调度到符合要求的Node节点上,该节点上的Kubelet就会去运行Pod以及Docker,Pod的存储以及网络都是Kubelet进行管理的 |
Container runtime | 负责镜像管理以及Pod和容器的真正运行(CRI) |
Kube-proxy | 负责为Service提供cluster内部的服务发现和负载均衡 |
Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。
二、Kubernetes部署
注意:需要关闭节点的selinux和iptables防火墙,所有节点部署docker引擎。
官网地址:Kubernetes 文档 | Kubernetes
部署参考文档:安装 kubeadm | Kubernetes
清除之前的设置:
[root@server2 ~]# docker stack rm web
[root@server2 ~]# docker service ls
[root@server2 ~]# docker swarm leave --force
[root@server2 ~]# cd /etc/systemd/system/docker.service.d/
[root@server2 docker.service.d]# ls
[root@server2 docker.service.d]# rm -fr 10-machine.conf
[root@server2 docker.service.d]# systemctl daemon-reload
[root@server2 docker.service.d]# systemctl restart docker
[root@server3 ~]# cd /etc/systemd/system/docker.service.d/
[root@server3 docker.service.d]# ls
[root@server3 docker.service.d]# rm -fr 10-machine.conf
[root@server3 docker.service.d]# systemctl daemon-reload
[root@server3 docker.service.d]# systemctl restart docker
[root@server4 ~]# docker swarm leave
禁用每个节点交换分区
[root@server2 ~]# swapoff -a
[root@server2 ~]# vim /etc/fstab
配置docker
[root@server2 ~]# cd /etc/docker/
[root@server2 docker]# ls
[root@server2 docker]# vim daemon.json ###修改驱动
{
"registry-mirrors": ["https://reg.westos.org"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
[root@server2 docker]# systemctl daemon-reload
[root@server2 docker]# systemctl restart docker
[root@server2 docker]# docker info ###报错
[root@server2 docker]# cd /etc/docker/
[root@server2 docker]# rm -f *.pem
[root@server2 docker]# systemctl enable docker.socket ###enable设置开机自起
[root@server2 docker]# systemctl enable docker.service
[root@server2 docker]# systemctl stop docker.socket ###先stop再start
[root@server2 docker]# systemctl stop docker
[root@server2 docker]# systemctl start docker.socket
[root@server2 docker]# systemctl start docker.service
[root@server2 docker]# docker info
[root@server2 docker]# scp daemon.json server3:/etc/docker/ ###将文件scp到server3和server4上
[root@server2 docker]# scp daemon.json server4:/etc/docker/
server3和server4上进行相同操作,禁用swap分区并重启docker和docker.socket
[root@server3 ~]# swapoff -a
[root@server3 ~]# vim /etc/fstab
[root@server3 ~]# systemctl enable docker.socket
[root@server3 ~]# systemctl daemon-reload
[root@server3 ~]# systemctl restart docker
[root@server3 ~]# docker info ###报错
[root@server3 ~]# systemctl stop docker
[root@server3 ~]# systemctl stop docker.socket
[root@server3 ~]# systemctl start docker.socket
[root@server3 ~]# systemctl start docker
[root@server3 ~]# docker info
[root@server4 ~]# swapoff -a
[root@server4 ~]# vim /etc/fstab
[root@server4 ~]# systemctl daemon-reload
[root@server4 ~]# systemctl restart docker
[root@server4 ~]# docker info
[root@server3 ~]# cd /etc/docker/
[root@server3 docker]# ls
ca.pem certs.d daemon.json key.json server-key.pem server.pem
[root@server3 docker]# rm -f *.pem
[root@server3 docker]# ls
certs.d daemon.json key.json
[root@server3 docker]# cd /etc/sysctl.d/
[root@server3 sysctl.d]# ls
99-sysctl.conf docker.conf
[root@server3 sysctl.d]# scp docker.conf server4:/etc/sysctl.d/
[root@server4 ~]# cd /etc/sysctl.d/
[root@server4 sysctl.d]# ls
99-sysctl.conf docker.conf
[root@server4 sysctl.d]# sysctl --system
镜像配置并安装部署软件kubeadm
[root@server2 yum.repos.d]# vim k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
[root@server2 yum.repos.d]# scp k8s.repo server3:/etc/yum.repos.d/
[root@server2 yum.repos.d]# scp k8s.repo server4:/etc/yum.repos.d/
[root@server2 yum.repos.d]# yum install -y kubeadm kubelet kubectl ##每个节点都安装
[root@server2 yum.repos.d]# systemctl enable --now kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
[root@server2 yum.repos.d]# ssh-keygen
[root@server2 yum.repos.d]# ssh-copy-id server3
[root@server2 yum.repos.d]# ssh-copy-id server4
[root@server2 yum.repos.d]# ssh server3 systemctl enable --now kubelet
[root@server2 yum.repos.d]# ssh server4 systemctl enable --now kubelet
[root@server2 yum.repos.d]# kubeadm config print init-defaults
配置镜像:
下载kubeadm kubelet kubectl
server2、3、4之间设置免密:
kubeadm config print init-defaults:查看默认配置信息
将server1设置为仓库,harbor中建立项目k8s:
列出所需的镜像,并拉取:
[root@server2 ~]# kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
[root@server2 ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
[root@server2 ~]# docker login reg.westos.org
Username: admin
Password:
awk命令上传到本地仓库
[root@server2 ~]# docker images |grep registry | awk '{print $1":"$2}' | awk -F/ '{system("docker tag "$0" reg.westos.org/k8s/"$3"")}'
[root@server2 ~]# docker images |grep k8s
[root@server2 ~]# docker images |grep k8s | awk '{system("docker push "$1":"$2"")}'
在仓库中查看一下镜像是否上传成功:
初始化:
[root@server2 ~]# kubeadm config images list --image-repository reg.westos.org/k8s
[root@server2 ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.westos.org/k8s ##初始化集群
[root@server2 ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
[root@server2 ~]# vim .bash_profile
export KUBECONFIG=/etc/kubernetes/admin.conf
安装flannel网络组件
在harbor仓库新建项目
下载kube-flannel.yml文件,查看所需镜像并上传到私有仓库
[root@server2 ~]# docker pull rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.1
[root@server2 ~]# docker pull rancher/mirrored-flannelcni-flannel:v0.17.0
[root@server2 ~]# docker tag rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.1 reg.westos.org/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.1
[root@server2 ~]# docker push reg.westos.org/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.1
[root@server2 ~]# docker tag rancher/mirrored-flannelcni-flannel:v0.17.0 reg.westos.org/rancher/mirrored-flannelcni-flannel:v0.17.0
[root@server2 ~]# docker push reg.westos.org/rancher/mirrored-flannelcni-flannel:v0.17.0
应用网络组件
[root@server2 ~]# kubectl apply -f kube-flannel.yml
网络pod已经生效
补齐命令功能
[root@server2 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc ###配置kubectl命令补齐功能
[root@server2 ~]# source .bashrc
将server3和4加入集群:
之前集群初始化时有加入集群的token令牌和hash值,若token和hash丢失,可以用命令找回
[root@server2 ~]# kubeadm token list ###找回token
[root@server2 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
> openssl dgst -sha256 -hex | sed 's/^.* //' ###找回hash
加入集群命令格式:
kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
在server3和server4上执行join命令,加入集群
[root@server3 ~]# kubeadm join 172.25.70.2:6443 --token va15g5.pol3hznkk080g1o7 \
> --discovery-token-ca-cert-hash sha256:c21863724e5cc80da299a52c9053411c792f49c71780d36bb81f0001c69b68f9
[root@server4 ~]# kubeadm join 172.25.70.2:6443 --token va15g5.pol3hznkk080g1o7 --discovery-token-ca-cert-hash sha256:c21863724e5cc80da299a52c9053411c792f49c71780d36bb81f0001c69b68f9
kubectl命令
kubectl命令指南:Kubectl Reference Docs
create 命令:根据文件或者输入来创建资源
# 创建Deployment和Service资源
$ kubectl create -f demo-deployment.yaml
$ kubectl create -f demo-service.yaml
delete 命令:删除资源
# 根据yaml文件删除对应的资源,但是yaml文件并不会被删除,这样更加高效
$ kubectl delete -f demo-deployment.yaml
$ kubectl delete -f demo-service.yaml
# 也可以通过具体的资源名称来进行删除,使用这个删除资源,同时删除deployment和service资源
$ kubectl delete 具体的资源名称
get 命令 :获得资源信息
$ kubectl get all ## 查看所有的资源信息
$ kubectl get --all-namespaces
$ kubectl get pod # 查看pod列表
$ kubectl get pod --show-labels # 显示pod节点的标签信息
$ kubectl get pods -l app=example # 根据指定标签匹配到具体的pod
$ kubectl get node # 查看node节点列表
$ kubectl get node --show-labels # 显示node节点的标签信息
$ kubectl get pod -o wide # 查看pod详细信息,也就是可以查看pod具体运行在哪个节点上(ip地址信息)
$ kubectl get svc ## 查看服务的详细信息,显示了服务名称,类型,集群ip,端口,时间等信息
$ kubectl get svc -n kube-system
$ kubectl get ns ## 查看命名空间
$ kubectl get namespaces
$ kubectl get pod --all-namespaces # 查看所有pod所属的命名空间
$ kubectl get pod --all-namespaces -o wide # 查看所有pod所属的命名空间并且查看都在哪些节点上运行
$ kubectl get rs ##查看目前所有的replica set,显示了所有的pod的副本数,以及他们的可用数量以及状态等信息
查看已经部署了的所有应用,可以看到容器,以及容器所用的镜像,标签等信息:
$ kubectl get deploy -o wide
$ kubectl get deployments -o wide