容器技术之kubernetes集群管理工具的简介以及部署
kubernetes一、kubernetes的简介(一)什么是kubernetes一、kubernetes的简介(一)什么是kubernetesKubetnetes简称为k8s
kubernetes
一、Kubernetes的简介
(一)什么是Kubernetes
Kubetnetes简称为k8s
k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非常的方便,而且可以做到故障自愈,例如一个服务器挂了,可以自动将这个服务器上的服务调度到另外一个主机上进行运行,无需进行人工干涉。
k8s可以更快的更新新版本,打包应用,更新的时候可以做到不用中断服务,服务器故障不用停机,从开发环境到测试环境到生产环境的迁移极其方便,一个配置文件搞定,一次生成image,到处运行。
k8s的全生命周期管理:
在k8s进行管理应用的时候,基本步骤是:创建集群,部署应用,发布应用,扩展应用,更新应用。
k8s的来源:
k8s是Kubernetes的缩写,源自谷歌的Borg,Borg是谷歌公司的内部容器管理系统。Borg系统运行几十万个以上的任务,来自几千个不同的应用,跨多个集群,每个集群(cell)有上万个机器。
它通过管理控制、高效的任务包装、超售、和进程级别性能隔离实现了高利用率。它支持高可用性应用程序与运行时功能,最大限度地减少故障恢复时间,减少相关故障概率的调度策略。该项目的目的是实现资源管理的自动化以及跨多个数据中心的资源利用率最大化。Kubernetes项目的目的就是将Borg最精华的部分提取出来,使现在的开发者能够更简单、直接地应用。它以Borg为灵感,但又没那么复杂和功能全面,更强调了模块性和可理解性。
k8s能干什么呢?
自动化容器的部署和复制
随时扩展或收缩容器规模
将容器组织成组,并且提供容器间的负载均衡
很容易地升级应用程序容器的新版本
提供容器弹性,如果容器失效就替换它
K8S有两个分类
(1)自主式pod:自我管理的,创建以后,仍然是提交给API Server,由API Server接收后借助Scheduler将其调度到指定的node节点,然后由node启动此节点,如果有pod中容器出现问题了,需要重启容器,那是由Keepalived来完成,但是如果节点故障了,pod也就消失了,所以,它有这样的坏处,没办法实现全局的调度,所以建议使用第二种pod
(2)控制器管理的pod,正是控制器这种机制的使用,使得在K8S上的集群设计中,pod完全就可以叫做有生命周期的对象,而后由调度器调度到集群中的某节点,运行以后,它的任务终止也就随着被删除掉,但是有一些任务,大家知道传统上有nginx、tomcat,它们是做为守护进程运行的,那么这种运行为pod容器的话,我们要确保它是时刻运行的,一旦出现故障我们要第一时间发现,要么是重建取代它,要么是重启,那么pod控制器就可以观测并实现
(二)设计架构
https://www.processon.com/view/5d579322e4b0869fa417e492?fromnew=1
k8s的核心组件
Kubernetes遵循master-slave architecture。Kubernetes的组件可以分为管理单个的 node 组件和控制平面的一部分的组件。
Kubernetes Master是集群的主要控制单元,用于管理其工作负载并指导整个系统的通信。Kubernetes控制平面由各自的进程组成,每个组件都可以在单个主节点上运行,也可以在支持high-availability clusters的多个主节点上运行。
kubelet需要安装在所有的节点上
Kubernetes做了什么
Kubernetes优秀的分布式架构设计,给我们提供了众多了可扩展接口,可以让我们很方便的扩展自己的运行时、网络和存储插件,同时还可以通过CRD管理我们自己的分布式应用。它的声明式配置方式可以让我们利用Kubernetes的原语快速的编排出一个云原生应用。
Kubernetes的资源隔离也能保证对集群资源的最大化和最优利用率。
下图中展示了Kubernetes中的资源隔离层次。
容器
Pod:命名空间的隔离,共享网络,每个Pod都有独立IP,使用Service Account为Pod赋予账户
Sandbox:是对最小资源调度单位的抽象,甚至可以是虚拟机
Node:网络隔离,每个节点间网络是隔离的,每个节点都有单独的IP地址
Cluster:元数据的隔离,使用Federation可以将不同的集群联合在一起
Kubernetes中的基本资源类型分成了三类:
部署:Deploymnt、StatefulSet、DaemonSet、Job、CronJob
服务:Service、Ingress
存储:PV、PVC、ConfigMap、Secret
在最近一届的KubeCon & CloudNativeCon上Operator已经变得越来越流行。下面是OpenEBS的一个使用Operator的例子。
二、K8s的部署
注意-
首先将之前docker swarm部署的集群leave
docker swarm leave
(一)步骤
1、所有节点在部署过程中关闭selinux和firewalld服务。
2、所有节点需要部署docker引擎,我是再之前的docker之上部署k8s,所以已经部署好了,只需要从docker的集群中退出即可。
3、在企业7中,官方中告诉使用的引擎方法已经改变,需要在docker.json文件中添加配置文件,所有节点都需要修改:
{
“registry-mirrors”: [“https://1wz754td.mirror.aliyuncs.com”], ##此项为阿里云的镜像仓库地址
“exec-opt”: [“native.cgroupdriver=systemd”],
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “100m”
},
“storage-driver”: “overlay2”,
“storage-opts”: [
“overlay2.override_kernel_check=true”
]
}
4、所有节点关闭swap分区
步骤:
swapoff -a
vim /etc/fstab
4、配置yum源
[net]
name=net
baseurl=http://192.168.181.207/docker-ce
gpgcheck=0
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
[iso]
name=iso
baseurl=http://192.168.181.207/rhel
gpgcheck=0
5、安装软件
[root@server1 yum.repos.d]# yum install -y kubelet kubeadm kubectl
部署节点设置kuberlet enalbe
6、配置
kubeadm config images list #查看所需要的镜像
kubeadm config print init-defaults #查看默认的配置
官网拉取不到镜像可以从阿里云拉取
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers # 查看阿里云镜像仓库
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers #从阿里云拉取镜像
server2和server3同时也要从阿里云拉取镜像
ubeadm config images pull --image-repository registry.aliyuncs.com/google_containers #拉取镜像
查看images
7、三台虚拟机拉去镜像至本地
8、集群的初始化
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers #需要网络插件(初始化集群)
kubeadm join 192.168.181.224:6443 --token pfdx2m.50j0pvzgwjr0yte3 \
--discovery-token-ca-cert-hash sha256:6806b7da2fcacea46b25d03a197cb462aeb06d5e8998f6fbfa1db342704321b0
#此命令初始化的时候生成,节点扩容server2和server3
注意kubeadm token list(只有24小时超过的话需要重新生成和添加)
server2和server3上执行
9、创建用户
创建一个用户来操作kube
useradd kubeadm #创建用户
visudo
10、根据提示创建文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get node #查看已经部署好的节点
echo "source <(kubectl completion bash )" >> ~/.bashrc #让kubectl可以补命令
可以看懂server3
和reg.westos.org两个节点已经被添加进来
11、安装网络插件
官方文档进行查看
根据官网提示,新的版本需要使用github的yml文件进行拉取镜像:
https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml#L3
将下图中的内容编写进kube-flannel.yml文件中:
写入的格式为:
\vi kube-flannel.yml #编辑文件,不使用这种办法会使得格式混乱
server1 server2和server3 #拉取镜像
12、拉取镜像
kubectl apply -f kube-flannel.yml
13、pod和node状态的查看
kubectl get pod -n kube-system ###查看pod状态
kubectl get nodes ###查看node状态
(二)、问题的处理
当遇到镜像拉取问题时候
kube-flannel-ds-amd64-xlzd6 0/1 Init:ErrImagePull 0 58s
有如下几种思路:
我的报错可以直接看出来就是镜像的拉取问题
1、删除报错的pod之后再查看:
[kubeadm@server1 ~]$ kubectl delete pod kube-flannel-ds-amd64-rw9n5 -n kube-system
我的删除完成之后发现依旧还有此问题:
2、我查看了kube-flannel.yml文件,发现有image之后的域名都是如下,但是手动使用此域名拉取镜像是不成功的。quay.io/coreos/flannel:v0.11.0-s390。
网上查资料以及前辈的指导,将quay.io更换为
quay-mirror.qiniu.com/coreos/flannel
3、查看之后发现pod和node均已经正常;
三、Pod管理
kubectl taint nodes --all node-role.kubernetes.io/master- 让master加入调度
(一)查看token
kubeadm token list ##查看tonke剩余的生效时间
失效之后可以重新生成:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //' #查看加密,生成新的token需要
kubeadm token create ### 生成token
(二)pod的管理
如何创建
(Ⅰ)创建内部访问pod
1、运行服务
kubectl run nginx --image=nginx --replicas=2 --record
2、查看运行的服务
kubectl get pod -o wide
3、设置端口映射、开启容器并进行当问
kubectl expose deployment nginx --port=80 --target-port=80
kubectl run test -it --image=busybox --restart=Never
wget -O - -q http://nginx
(Ⅱ)创建外部访问pod
第一种方法: kubectl expose deployment nginx --port=80 --target-port=80 --type=Nodeport #直接可以用命令来指定
第二种办法;编辑文件:
kubectl edit svc nginx #编辑文件 将type=Nodeport
kubectl describe svc nginx #查看
==如果是在原有的基础上更改的话,就需要使用方法二,修改type为 NodePort
访问任意一份server都可以
方法二:创建的时候直接使用命令提前设置好
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
(三)pod的扩容和缩减
扩容和缩减都使用参数–replicas后面跟几个就总容量为几
kubectl scale deployment nginx --replicas=3
(四)pod的更新和回滚
更新使用命令
kubectl set image deployment/nginx nginx=需要的版本号
回滚使用命令
kubectl rollout undo deployment nginx --to-revision=1
后面的1意思是查看更新时的历史记录的序号
kubectl rollout history deployment nginx
deployment.apps/nginx
REVISION CHANGE-CAUSE
1 kubectl run nginx --image=nginx --replicas=2 --record=true
更多推荐
所有评论(0)