Kubernet安装及pod(1)

一、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
node2172.25.7.2
node3172.25.7.3
node4172.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(充当客户端)

 开始更新:

第一次容器名字没弄对

更新成功:

测试:

回退:到第一个版本

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个 kubernetes 3 副本 pod 映射文件夹的示例: apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image volumeMounts: - name: my-volume mountPath: /data volumes: - name: my-volume emptyDir: {} ### 回答2: Kubernetes是一个流行的容器编排平台,允许开发人员和管理员在云端环境中管理、自动化部署和扩展应用程序。PodKubernetes中最小的管理单位,可以包含一个或多个容器。 要在Kubernetes上创建一个3副本Pod映射到一个文件夹,我们可以编写一个YAML文件来定义这个Pod的规格。下面是一个示例: ``` apiVersion: v1 kind: Pod metadata: name: my-pod spec: replicas: 3 containers: - name: my-container image: nginx volumeMounts: - name: shared-data mountPath: /data volumes: - name: shared-data emptyDir: {} ``` 在这个例子中,我们使用了Nginx镜像作为容器的映像。在容器规格中,我们指定了要创建的3个副本(replicas)的数量。 在container下面,我们通过volumeMounts字段来指定容器需要挂载的存储卷,我们将一个名为shared-data的存储卷挂载到了容器的/mnt/data路径下。 在volumes字段中,我们定义了一个名为shared-data的存储卷。在这个例子中,我们使用了一个名为emptyDir的存储卷类型,它会在Pod被调度到具体的节点上时创建一个空目录。 当这个Pod被创建时,Kubernetes会负责将这个存储卷挂载到每个Pod的对应容器内的指定路径上,使得这个文件夹能够在所有副本之间共享。这样,我们就可以在这个文件夹中存储和共享数据了。 这只是一个简单的示例,实际上在实际应用中还有许多其他配置选项和更复杂的存储方案可以使用。但是,这个例子提供了一个基本的思路,帮助我们理解如何在Kubernetes上创建一个3副本Pod并映射一个文件夹。 ### 回答3: Kubernetes(K8s)是一个开源的容器编排引擎,用于自动化部署、扩展和管理容器化应用程序。在Kubernetes中,我们可以使用Pod作为最小的部署单元。Pod是一个或多个容器的组合,它们共享网络和存储资源,并一起运行在同一个工作节点上。每个Pod都有唯一的IP地址,可以通过该IP地址进行访问。 在Kubernetes中,我们可以通过编写YAML文件来定义和创建Pod。下面是一个包含三个副本的Pod映射文件夹的例子: ```yaml apiVersion: v1 kind: Pod metadata: name: my-pod spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-container image: my-image:latest volumeMounts: - name: my-volume mountPath: /my-folder volumes: - name: my-volume hostPath: path: /path/to/folder ``` 在上面的例子中,我们创建了一个名为"my-pod"的Pod。通过指定"replicas"属性为3,我们创建了三个副本(replicas)的Pod。"selector"用于选择要在这些Pod中运行的容器,通过"app: my-app"标签选择。在"template"中,我们指定了每个Pod的配置。"labels"定义了Pod的标签,用于选择器。"containers"中我们定义了一个名为"my-container"的容器。在该容器中,我们指定了要使用的镜像以及要将宿主机文件夹/my-folder映射到容器内的/mounted-folder的目录。"volumes"用于定义Pod的持久化存储,我们在这里使用了一个宿主机路径(hostPath)类型的卷,将宿主机上/path/to/folder文件夹映射到Pod的/my-folder中。 通过这个YAML文件,Kubernetes将会创建三个副本的Pod,每个Pod中都运行一个容器,并将宿主机上/path/to/folder文件夹映射到容器内的/my-folder目录中。这样,我们就可以在每个Pod中访问和处理/my-folder目录中的文件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值