一、Kubernets简介
容器的调度工具
Kubernets是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署,自动扩缩 容,维护等功能。
通过使用kubernets可以:
- 快速部署应用
- 快速扩展应用
- 无缝对接新的应用功能
- 节省资源,优化硬件资源的使用
kubernets的特点:
- 可移植性:支持公有云,私有云,混合云,多重云
- 可扩展:模块化,插件化,可挂载,可组合
- 自动化:自动部署,自动重启,自动复制,自动伸缩扩展
kubernets主要由以下几个核心组件构成:
- etcd:保存了整个集群的状态
- apiserver:提供了资源操作的唯一入口,并提供认证,授权,访问控制,API注册和发现等机制
- controller manager:负责维护集群的状态,比如故障旧检测,自动扩展,滚动更新等。
- scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
- kubelet:负责维护容器的生命周期,同时也负责Volume (CVI)和网络(CNI)的管理
- Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)
- kube-proxy:负责Service提供cluster内部的服务发现和负载均衡
除了核心组件,还有一些推荐的Add-ons:
- kube-dns负责为整个集群提供DNS服务
- ingress Controller:为服务提供外网入口
- Heapster:提供资源监控
- Dashboard:提供GUI
- Federation:提供跨可用区的集群
- Fuented-elasticsearch:提供集群日志采集,存储与查询
二、部署
主机号 | ip |
node2 | 172.25.7.2 |
node3 | 172.25.7.3 |
node4 | 172.25.7.4 |
node5 (reg.westos.org) | 172.25.7.5 |
1.所有节点关闭防火墙和selinux。装好docker-ce和docker-ce-cli。保证所有节点可以上网,需要在真机上添加策略。
所有节点部署docker引擎:
yum install docker-ce docker-ce-cli
vim /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
sysctl --system #重新加载
systemctl enable docker #设置开机自启
systemctl start docker #开启docker服务
[root@foundation7 Desktop]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@foundation7 Desktop]#iptables -t nat -I POSTROUTING -s 172.25.7.0/24 -j MASQUERADE
2.修改docker驱动:
[root@node2 ~]# vim /etc/docker/daemon.json
[root@node2 ~]# systemctl daemon-reload
[root@node2 ~]# systemctl restart docker
给其他节点也添加上并重启服务:
3.禁用swap分区:
- swapoff -a
- 注释掉/etc/fstab文件中的swap定义
node3,node4做同样的操作
4.安装部署软件kubeadm:
配置好yum源:
[root@node2 yum.repos.d]# pwd
/etc/yum.repos.d
[root@node2 yum.repos.d]# vim k8s.repo
[root@node2 yum.repos.d]# cat k8s.repo
[kubernetes]
name=kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
enabled=1
[root@node2 yum.repos.d]# scp k8s.repo node3:/etc/yum.repos.d/ #将yum源给node3和node4一份
k8s.repo 100% 129 109.4KB/s 00:00
[root@node2 yum.repos.d]# scp k8s.repo node4:/etc/yum.repos.d/
k8s.repo
yum 源配好后安装软件:
[root@node2 yum.repos.d]# yum install kubelet kubectl kubeadm -y
[root@node3 docker]# yum install kubelet kubectl kubeadm -y
[root@node4 ~]# yum install kubelet kubectl kubeadm -y
安装完毕后开启服务并设置开机自启:
[root@node2 yum.repos.d]# systemctl enable --now kubelet
[root@node3 docker]# systemctl enable --now kubelet
[root@node4 ~]# systemctl enable --now kubelet
5.默认从k8s.gcr.io上下载镜像,需要翻墙才可以,所以需要修改镜像仓库拉取镜像:
[root@node2 yum.repos.d]# kubeadm config images list --image-repository registry.aliyuncs.com/google_comtainers
W0216 16:46:10.869432 5483 version.go:101] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://dl.k8s.io/release/stable-1.txt: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
W0216 16:46:10.869512 5483 version.go:102] falling back to the local client version: v1.17.3
W0216 16:46:10.869893 5483 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0216 16:46:10.869903 5483 validation.go:28] Cannot validate kubelet config - no validator is available
registry.aliyuncs.com/google_comtainers/kube-apiserver:v1.17.3
registry.aliyuncs.com/google_comtainers/kube-controller-manager:v1.17.3
registry.aliyuncs.com/google_comtainers/kube-scheduler:v1.17.3
registry.aliyuncs.com/google_comtainers/kube-proxy:v1.17.3
registry.aliyuncs.com/google_comtainers/pause:3.1
registry.aliyuncs.com/google_comtainers/etcd:3.4.3-0
registry.aliyuncs.com/google_comtainers/coredns:1.6.5
[root@node2 yum.repos.d]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers #拉取镜像
W0216 16:48:36.726412 5568 version.go:101] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://dl.k8s.io/release/stable-1.txt: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
W0216 16:48:36.726791 5568 version.go:102] falling back to the local client version: v1.17.3
W0216 16:48:36.726993 5568 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0216 16:48:36.727000 5568 validation.go:28] Cannot validate kubelet config - no validator is available
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.17.3
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.17.3
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.3
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.17.3
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.1
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.4.3-0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:1.6.5
6.添加pod
[root@node2 ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers
将node3和node4也加进去
[root@node3 ~]# kubeadm join 172.25.7.2:6443 --token xp0kxn.ozserbblfmy35mxd \
> --discovery-token-ca-cert-hash sha256:7a558f682b7c6d609ccf3f5c23639643f2a5c37d4b82161a6017da375089098e
[root@node4 ~]# kubeadm join 172.25.7.2:6443 --token xp0kxn.ozserbblfmy35mxd \
> --discovery-token-ca-cert-hash sha256:7a558f682b7c6d609ccf3f5c23639643f2a5c37d4b82161a6017da375089098e
W0216 17:26:56.606271 1633 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.
使用kubeadm集群创建完后,使用kubectl使生效:
7.配置Kubectl
[root@node2 ~]# useradd kubeadm
[root@node2 ~]# id kubeadm
uid=1000(kubeadm) gid=1000(kubeadm) groups=1000(kubeadm)
[root@node2 ~]# visudo
[root@node2 ~]# su - kubeadm
[kubeadm@node2 ~]$ mkdir -p $HOME/.kube
[kubeadm@node2 ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[kubeadm@node2 ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
[kubeadm@node2 ~]$ kubectl get node
NAME STATUS ROLES AGE VERSION
node2 NotReady master 27m v1.17.3
node3 NotReady <none> 24m v1.17.3
node4 NotReady <none> 23m v1.17.3
配置kubectl命令补全功能:
[kubeadm@node2 ~]$ echo "source <(kubectl completion bash)" >> ~/.bashrc
8.安装flannel网络组件
原先:
将网上下的yml文件全部复制下来,使用vi创建kube-flannel.yml文件。
查看pod状态已变为running和镜像,三个节点均已下载。
master状态查看:
kubectl get cs
kubectl get node
kubectl get pod -n kube-system
2020年6月24日:
隔了一段时间再重新来部署k8s集群,此时下载的k8s是v1.18.4版本,已更新,所以,新的kube-flannel.yml生成方式:
命令行执行,kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml。
执行完毕,查看,镜像已下载
三、pod管理
注意1:由于实验中途更换集群:
现在的实验环境是:
node1:172.25.7.131 | 主节点 |
node2:172.25.7.132 | |
node3:172.25.7.133 | |
reg.westos.org:172.25.7.134 | 私有仓库 |
注意2:k8s各节点需要从habor私有仓库处获取证书到各自的/etc/docker/certs.d/reg.westos.org/ca.crt。并systemctl daemon-reload ,systemctl restart docker
pod是可以创建和管理kubernetes计算的最小部署单元,一个pod代表着集群中运行的一个进程,每个 pod都有唯一的ip
一个pod类似一个豌豆荚包含一个或者多个容器,多个容器间共享IPC,Network和UTC namespace。
1.创建Pod应用
[kubeadm@node1 ~]$ kubectl create deployment 618 --image=nginx #部署名为618的集群
[kubeadm@node1 ~]$ kubectl scale deployment 618 --replicas=3 #扩容,扩为3个
2.pod的删除
[kubeadm@node1 ~]$ kubectl delete pod 618-79656486db-kv6sd #临时删除,删除完,会立马创建一个新的pod
kubectl get deployments.apps #查看deployments
kubectl delete deployments.apps 618 #永久删除
集群内部节点可以访问pod,但集群外部无法直接访问
3.1
service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务。集群内部访问
3.1 启用一个pod才能内部访问
将ip对外出去
创建service,pod客户端可以访问
ClusterIP:默认类型,自动分配一个仅集群内部可以访问的虚拟ip,反向代理的感觉
kubectl expose deployment nginx --port=80 --target-port=80 #创建服务
kubectl get svc #查看服务
kubectl describe svc nginx #查看nginx服务的详细信息
3.2NodePoet类型,集群外部客户端访问Pod
NodePort:在ClusterIP基础上为Service在每一台机器上绑定一个端口,这样就可以通过NodeIP:NodePort来访问该服务
[kubeadm@node1 ~]$ kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort #创建的时候指定service类型
创建好的可以编辑修改:
[kubeadm@node1 ~]$ kubectl edit svc ngin #会打开一个配置文件,将type修改即可
修改type之后 可以通过ip+port访问:
4.pod的扩容与缩容
kubectl scale deployment nginx --replicas=6 #增加节点至6
kubectl scale deployment nginx --replicas=3 #减小节点至3
5.更新
[kubeadm@node1 ~]$ kubectl set image deployment/nginx nginx=nginx:1.16 #更新至1.16
[kubeadm@node1 ~]$ kubectl get pod -w #-w 观察过程
[kubeadm@node1 ~]$ kubectl rollout history deployment nginx #查看历史版本
[kubeadm@node1 ~]$ kubectl rollout undo deployment nginx --to-revision=1 #回滚版本到1
2020年6月24日做的更新操作:
创建好集群:
[root@node1 ~]# kubectl create deployment jd618 --image=nginx
deployment.apps/jd618 created
[root@node1 ~]# kubectl scale deployment jd618 --replicas=3
deployment.apps/jd618 scaled
[root@node1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
jd618-77897d867b-659cc 1/1 Running 0 9s
jd618-77897d867b-7lr2j 1/1 Running 0 9s
jd618-77897d867b-ph9b8 1/1 Running 0 37s 4
[root@node1 ~]# kubectl expose deployment jd618 --port=80 --target-port=80 #创建服务,端口映射
service/jd618 exposed
[root@node1 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jd618 ClusterIP 10.98.32.39 <none> 80/TCP 8s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24h
以下是更新,回滚基础命令:
kubectl set image deployment jd618 nginx=myapp:v1 --record #更新。集群名为jd618,原本集群中的每个容器所用镜像是nginx,现用myapp镜像更新。--record,记录命令
kubectl get all #查看所有,里面记录曾经的版本
kubectl rollout history deployment jd618 #查看升级时输入的命令,有--record才记录
[root@node1 ~]# kubectl rollout undo deployment jd618 --to-revision=1 #回退第一个版本
get pod 看一下,进入测试demo(充当客户端)
开始更新:
第一次容器名字没弄对
更新成功:
测试:
回退:到第一个版本