设为首页 收藏本站
查看: 2637|回复: 0

[经验分享] kubernetes 一些基本的概念

[复制链接]

尚未签到

发表于 2018-1-4 14:55:47 | 显示全部楼层 |阅读模式
  k8s 原理

  kubernetes API server 作为集群的核心,负责集群各功能之间的通信, 集群内的各个功能模块通过API Server将信息存入etcd,当需要获取和操作这些数据的时候
  通过API Server 提供的 REST 接口(get put post watch) 来实现。
  场景一: node节点的 kubelet --------> apiserver
  node上的 kubelet 进程每隔一个时间周期,就会调用一次API Server接口报告自身状态,API Server接受这些信息后,将节点状态更新到etcd中
  kubelet也通过API Server的 WATCH接口监听pod信息,如果监控到新的pod副本被调度绑定到本节点,则执行pod对应的容器的创建和启动,如果
  如果监听到pod对象被删除,则删除本节点对应的pod容器。
  场景二: master kube-controller-manager  --------> apiserver
  kube-controller-manager 中的node controller 模块通过 API Server提供的Watch接口,实时监控node的状态信息
  controller-manager 作为集群内部的管理控制中心,负责集群内的node,pod副本, 命名空间namespace, 服务账号,资源定额等的管理,当某个node 宕机,
  controller manager 就会及时防线故障并自动修复。



  k8s网络
  使用weave网络




  

etcd 中注册的对象内容。
[iyunv@docker1 ~]# etcdctl ls /registry

  
/registry/controllers
  
/registry/daemonsets
  
/registry/namespaces
  
/registry/ranges
  
/registry/replicasets
  
/registry/serviceaccounts
  
/registry/ingress
  
/registry/clusterrolebindings
  
/registry/secrets
  
/registry/services
  
/registry/certificatesigningrequests
  
/registry/configmaps
  
/registry/clusterroles
  
/registry/deployments
  
/registry/events
  
/registry/minions
  
/registry/pods
  

  

API server: 提供了HTTP Rest接口,可以对所有资源进行增 删 改 查,是整个集群的入口  
controller Mananter: 所有资源对象的自动化控制中心
  

  
scheduler: 负责资源调度。
  

  
kubelet,负责pod的创建 启停,与master 节点密切协作,实现集群管理的功能
  
kube
-proxy: 实现service的通信与负载均衡机制  

  DaemonSet
  DaemonSet能够让所有(或者一些特定)的Node节点运行同一个pod。当节点加入到kubernetes集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从kubernetes集群中被移除,被(DaemonSet)调度的pod会被移除,如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。
  在使用kubernetes来运行应用时,很多时候我们需要在一个区域(zone)或者所有Node上运行同一个守护进程(pod),例如如下场景:


  • 每个Node上运行一个分布式存储的守护进程,例如glusterd,ceph
  • 运行日志采集器在每个Node上,例如fluentd,logstash
  • 运行监控的采集端在每个Node,例如prometheus node exporter,collectd等
  在简单的情况下,一个DaemonSet可以覆盖所有的Node,来实现Only-One-Pod-Per-Node这种情形;在有的情况下,我们对不同的计算几点进行着色,或者把kubernetes的集群节点分为多个zone,DaemonSet也可以在每个zone上实现Only-One-Pod-Per-Node。
  什么是Deployment
  Kubernetes Deployment提供了官方的用于更新Pod和Replica Set(下一代的Replication Controller)的方法,您可以在Deployment对象中只描述您所期望的理想状态(预期的运行状态),Deployment控制器为您将现在的实际状态转换成您期望的状态,例如,您想将所有的webapp:v1.0.9升级成webapp:v1.1.0,您只需创建一个Deployment,Kubernetes会按照Deployment自动进行升级。现在,您可以通过Deployment来创建新的资源(pod,rs,rc),替换已经存在的资源等。
  Deployment集成了上线部署、滚动升级、创建副本、暂停上线任务,恢复上线任务,回滚到以前某一版本(成功/稳定)的Deployment等功能,在某种程度上,Deployment可以帮我们实现无人值守的上线,大大降低我们的上线过程的复杂沟通、操作风险。
  Deployment的使用场景
  下面是Deployment的典型用例:


  • 使用Deployment来启动(上线/部署)一个Pod或者ReplicaSet
  • 检查一个Deployment是否成功执行
  • 更新Deployment来重新创建相应的Pods(例如,需要使用一个新的Image)
  • 如果现有的Deployment不稳定,那么回滚到一个早期的稳定的Deployment版本
  • 暂停或者恢复一个Deployment
  kind: 定义的对象: Replicationcontroller,  ReplicaSet  Deployment 区别
  Replicationcontroller 的升级版是 ReplicaSet , ReplicaSet支持基于集合的 Label selector, 而RC只支持基于等式的 Lable select
  Deployment其实就是内部调用 ReplicaSet.
  DaemonSet 根据标签指定pod 在那个服务器上运行,需要与nodeselect 公用。
  configMap 设置环境变量
  server定义的selector 与 Deployment 中的 template 的 lables 对应
  

apiVersion: extensions/v1beta1  
kind: Deployment
  
metadata:
  name: tomcat
-deployment  
spec:
  replicas:
3  template:
  metadata:
  labels:
  app: tomcat
  tier: frontend
  spec:
  containers:
- name: tomcat  image: docker.cinyi.com:
443/tomcat  ports:
- containerPort: 80  
---
  
apiVersion: v1
  
kind: Service
  
metadata:
  name: tomcat-server
  
spec:
  ports:
  - port: 11111   # cluster IP 的端口
  targetPort: 8080  # container容器的端口
  selector:
  tier: frontend
  

  外部系统访问service 问题
  kubernetes 中三种IP 包括
  

1. NodeIP   node节点的IP地址  

2. PodIP     pod的IP地址  

3. clusterIP   service的IP地址  

  
nodeIP 是kubernetes集群中每个节点的物理网卡的IP地址, client 访问kubernetes集群使用的IP地址
  

  
Pod ip地址 是更具创建的网络类型,网桥分配的IP地址,
  

  
clusterIP 是一个虚拟的IP, cluster ip 仅作用于kubernetes service 这个对象, 是由kubernetes管理和分配ip地址,源于cluster ip地址池
  
[iyunv@kubernetes nginx]# vim
/etc/kubernetes/apiserver  
# Address range to use
for services  
KUBE_SERVICE_ADDRESSES
="--service-cluster-ip-range=10.254.0.0/16"  

  
cluster IP 无法ping通, 因为没有一个 实体网络对象 响应
  

  
cluster ip 只能结合 service port 组成一个具体的通信接口,单独的cluster IP不具备tcp
/ip通信基础,  如果 pod 对外访问,需要在servcie 中 指定 type 为 NodePort
  

  apiVersion: extensions/v1beta1
  kind: Deployment
  metadata:
  name: tomcat-deployment
  spec:
  replicas: 3
  template:
  metadata:
  labels:
  app: tomcat
  tier: frontend
  spec:
  containers:
  - name: tomcat
  image: docker.cinyi.com:443/tomcat
  ports:
  - containerPort: 80
  ---
  apiVersion: v1
  kind: Service
  metadata:
  name: tomcat-server
  spec:
  type: NodePort
  ports:
  - port: 11111
  targetPort: 8080
  nodePort: 30001
  selector:
  tier: frontend
  root@kubernetes nginx]# kubectl describe service tomcat-server
  Name:tomcat-server
  Namespace:          default
  Labels:             <none>
  Selector:            tier=frontend
  Type:              NodePort
  IP:              10.254.222.139        #cluster IP 的地址
  Port:               <unset>11111/TCP    #cluster IP 的端口
  NodePort:           <unset>30001/TCP     # nodeport 的端口
  Endpoints:          10.0.223.3:8080,10.0.224.2:8080,10.0.225.2:8080   #容器的服务端口
  Session Affinity:       None
  No events.
  访问node IP + node port ,可以访问页面
  nodeport 并没有完全解决外部访问service 的问题, 比如负载均衡问题,如果有10 pod 节点, 如果是用谷歌的GCE公有云,那么可以把 service  type=NodePort 修改为 LoadBalancer.
  2 通过设置pod(daemonset) hostNetwork=true, 将pod中所有容器的端口号直接映射到物理机上, 设置hostNetwork=true的时候需要注意,如果不指定hostport,默认hostport 等于containerport, 如果指定了hostPort, 则hostPort 必须等于containerPort的值。

  deployment创建部署
  

[iyunv@docker ~]# cat  test_deployment.yaml  apiVersion: extensions/v1beta1
  
kind: Deployment
  
metadata:
  name: my-nginx
  
spec:
  replicas: 3
  template:
  metadata:
  labels:
  app: nginx
  spec:
  containers:
  - name: nginx
  image: docker.cinyi.com:443/senyint/im-web
  ports:
  - containerPort: 80
  

  

1. 创建
[iyunv@docker ~]# kubectl create -f  /root/test_deployment.yaml

  2. 查看状态
  

$ kubectl get deployments  
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
  
my-nginx           3         0         0            0           1s
  DESIRED 期望的副本数
  CURRENT 当前副本数
  UP-TO-DATA 最新副本数
  AVALLABLE  可用副本数
  3. 更新部署(镜像升级)
  (1)把image镜像从 docker.cinyi.com:443/senyint/nginx 升级到  docker.cinyi.com:443/senyint/im-web
[iyunv@docker ~]# kubectl set image deployment/my-nginx  nginx=docker.cinyi.com:443/senyint/im-web


  

  

(2) 直接使用edit 修改
[iyunv@docker ~]# kubectl edit  deployment/my-nginx

  4.扩展副本数
[iyunv@docker ~] kubect scale deployment my-nginx  --replicas=10

  5.api
  /apis/extensions/v1beta1/namespaces/default/deployments/my-nginx
  

  ReplicationController创建部署
  

apiVersion: v1  
kind: ReplicationController
  
metadata:
  name: im
-webnamespace: test  
spec:
  replicas:
3  template:
  metadata:
  labels:
  name: im
-web  spec:
  volumes:
- name: workdir  hostPath:
  path:
"/data/log/im-web"  containers:
- name: im-web  image: docker.cinyi.com:
443/senyint/im-web:latest  ports:
- containerPort: 80  volumeMounts:
- name: workdir  mountPath:
/data/tomcat/logs  

  

扩容副本  
[iyunv@docker1
~]#  kubectl  scale rc im-web --namespace=test --replicas=5  

  
滚动升级
  
[iyunv@docker1
~]# kubectl rolling-update im-web --image=docker.cinyi.com:443/senyint/im-web:2017-03-21_10_12  api
  /api/v1/namespaces/test/replicationcontrollers/im-web
  

  kubernetes volume(存储卷)
  volume 是pod中能够被多个容器访问的共享目录, volume 定义在pod上,然后被一个pod里的多个容器挂载到具体的文件目录下,其实volume与pod的声明周期相同,与容器的生命周期无关系,
  kubernetes 支持多种类型的volume,如:glusterfs  ceph等分布式文件系统
  

1.emptyDir:  apiVersion: extensions/v1beta1
  
kind: Deployment
  
metadata:
  name: tomcat-deployment
  
apiVersion: extensions/v1beta1
  
kind: Deployment
  
metadata:
  name: tomcat-deployment
  
spec:
  replicas: 3
  template:
  metadata:
  labels:
  app: tomcat
  tier: frontend
  spec:
  volumes:
  - name: workdir
  emptyDir: {}
  containers:
  - name: tomcat
  image: docker.cinyi.com:443/tomcat
  ports:
  - containerPort: 80
  volumeMounts:
  - name: workdir
  mountPath: /opt
  
---
  
apiVersion: v1
  
kind: Service
  
metadata:
  name: tomcat-server
  
spec:
  type: NodePort
  ports:
  - port: 11111
  targetPort: 8080
  nodePort: 30001
  selector:
  tier: frontend
  emptyDir volume是在pod 分配到node是创建的,初始内容为空,并且无需指定宿主机上的对应的目录文件,当pod从node上移除时,emptydir中的数据也会永久被删除,目前emptyDir无法控制介质种类
  emptpdir 的一些用途如下:
  1. 临时空间,例如用于某些应用程序运行时所需的临时目录,且无须永久保修
  2. 长时间任务的中间过程checkpoint 的临时保存目录
  3. 一个容器需要从另一个容器中获取数据的目录。
  

  

2. hostPath 为在pod上挂载宿主机上的文件或者目录,  volumes:
  - name: "storage"
  hostPath:
  path: "/data"
  -------------------
  

  apiVersion: extensions/v1beta1
  
kind: Deployment
  
metadata:
  name: tomcat-deployment
  
spec:
  replicas: 3
  template:
  metadata:
  labels:
  app: tomcat
  tier: frontend
  spec:
  volumes:
  - name: workdir
  hostPath:
  path: "/data"
  containers:
  - name: tomcat
  image: docker.cinyi.com:443/tomcat
  ports:
  - containerPort: 80
  volumeMounts:
  - name: workdir
  mountPath: /opt      #把宿主机/data目录挂载到容器的/opt目录下
  
---
  
apiVersion: v1
  
kind: Service
  
metadata:
  name: tomcat-server
  
spec:
  type: NodePort
  ports:
  - port: 11111
  targetPort: 8080
  nodePort: 30001
  selector:
  tier: frontend
  

  3. gcePersistentDisk google云盘
  4.awsEasticblockStore 亚马逊云盘
  5 nfs, 使用nfs网络文件服务器提供的共享目录存储数据时,需要部署一个nfs server,定义nfs类型volume 如:
  

        volumeMounts:- name: workdir  nfs:
  server: nfs-server
  path: "/"
  

  6. 其他类型的volume
  

iscsi: 使用iscsi存储设备上的目录挂载到pod上。  
flock: 使用flocker来管理存储卷
  
glusterfs: 使用glusterfs分布式文件系统
  
等等.....
  

  Namespace 命名空间
  

  

  Namespace 在很多情况下用于多租户的资源隔离,Namespace通过将集群内部的资源对象“分配”到不通的Namespace中, 形成逻辑上的分组的不同项目,小组或者 用户组,便于不同的分组在共享使用这个集群的资源的同时还能被分别管理。
  

  

  kubernetes集群在启动后,会创建一个 default 的 namespace,
  

  

[iyunv@kubernetes nginx]# kubectl get namespace

  NAME              STATUS    AGE
  default            Active        7d
  kube-system   Active        7d
  

  

  如果不特别指明namespace,则用户创建的 pod rc service 都将被系统创建到defalut中
  

  #创建fengjian20170221 的命名空间
  apiVersion: v1
  
kind: Namespace
  
metadata:
  name: fengjian20170221
  

  

---  

  
apiVersion: extensions
/v1beta1  
kind: Deployment
  
metadata:
  name: tomcat
-deploymentnamespace: fengjian20170221  
spec:
  replicas:
3  template:
  metadata:
  labels:
  app: tomcat
  tier: frontend
  spec:
  volumes:
- name: workdir  hostPath:
  path:
"/data"  containers:
- name: tomcat  image: docker.cinyi.com:
443/tomcat  ports:
- containerPort: 80  volumeMounts:
- name: workdir  mountPath:
/opt  

---  
apiVersion: v1
  
kind: Service
  
metadata:
  name: tomcat
-server  
spec:
  type: NodePort
  ports:
- port: 11111  targetPort:
8080  nodePort:
30001  selector:
  tier: frontend
  

[iyunv@kubernetes nginx]# kubectl get namespace

  NAME                     STATUS        AGE
  default                 Active        7d
  fengjian20170221   Active        2m
  kube-system           Active        7d
[iyunv@kubernetes nginx]# kubectl get pods --namespace=fengjian20170221

  NAME                                                  READY    STATUS      RESTARTS   AGE
  tomcat-deployment-2750437860-4no2f   1/1         Running     0              5m
  tomcat-deployment-2750437860-mmk4b   1/1         Running     0      5m
  tomcat-deployment-2750437860-yb8u2   1/1         Running     0              5m
  guestbook 示例:

  3个php, 1个redis主 ,2 个redis从
  

[iyunv@kubernetes guestbook]# vim redis-master.yaml  

  
apiVersion: extensions
/v1beta1  
kind: Deployment
  
metadata:
  name: redis
-master  
spec:
  replicas:
1  template:
  metadata:
  labels:
  app: redis
-master  spec:
  containers:
- name: redis-master  image: docker.cinyi.com:
443/kubeguide/redis-master  ports:
- containerPort: 6379  env:
- name: hostname  value: fengjian
  

---  
apiVersion: v1
  
kind: Service
  
metadata:
  name: redis
-master  
spec:
  ports:
- port: 6379  targetPort:
6379  selector:
  app: redis
-master  

  
#########################
  

  
apiVersion: extensions
/v1beta1  
kind: Deployment
  
metadata:
  name: redis
-slave  
spec:
  replicas:
2  template:
  metadata:
  labels:
  app: redis
-slave  spec:
  containers:
- name: redis-slave  image: docker.cinyi.com:
443/kubeguide/guestbook-redis-slave  ports:
- containerPort: 6379  env:
- name: GET_HOSTS_FROM  value: env
  

---  
apiVersion: v1
  
kind: Service
  
metadata:
  name: redis
-slave  
spec:
  ports:
- port: 6379  targetPort:
6379  selector:
  app: redis
-slave  

  

  
############################
  

  
[iyunv@kubernetes guestbook]# vim frontend
-php.yaml  

  
apiVersion: extensions
/v1beta1  
kind: Deployment
  
metadata:
  name: frontend
-server  
spec:
  replicas:
2  template:
  metadata:
  labels:
  app: frontend
-server  spec:
  containers:
- name: frontend-server  image: docker.cinyi.com:
443/kubeguide/guestbook-php-frontend  ports:
- containerPort: 80  env:
- name: GET_HOSTS_FROM  value: env
  

---  
apiVersion: v1
  
kind: Service
  
metadata:
  name: frontend
-server  
spec:
  type: NodePort
  ports:
- port: 80  targetPort:
80  nodePort:
30001  selector:
  app: frontend
-server
[iyunv@kubernetes guestbook]# kubectl   create  -f redis-master.yaml -f redis-slave.yaml  -f frontend-php.yaml

[iyunv@kubernetes guestbook]# kubectl  get service

  
  
  访问 nodeIP+端口, 可以访问出程序页面,
  

  


Pod 声明周期和重启策略
  

状态        描述  Pending      API server 已经创建该Pod,但pod 内还有一个或多个容器的镜像还有创建,包括正在下载镜像的过程
  Running      pod内的所有容器均已创建,且至少有一个容器处于运行状态,正在启动状态或正在重启状态。
  Successed     Pod内所有容器均成功执行退出,且不会重启
  Failed       Pod内所有容器均已退出,但至少一个容器退出为失败状态
  Unknown      由于某种原因无法获取该pod的状态,可能由于网络问题
  

  Pod重启策略(restartpolicy) 应用于pod内的所有容器,并且仅在pod所处的node上由kubelet进行判断和重启操作,
  

pod 的重启策略包括always、 onfailure 、 Never, 默认为always.  always: 懂容器失效时,有kubulet自动重启该容器
  onfailure: 当容器终止运行且退出码不为0,有kubulet 自动重启容器
  never: 不论容器运行状态如何,kubelet都不会重启该容器。
  


Pod扩容和缩容
  在生产环境中,经常会遇到某个服务需要扩容的场景,也可能会遇到由于资源紧张或工作负载降低减少服务实例的场景,可以使用 RC 的 scale机制操作
  

[iyunv@kubernetes guestbook]# kubectl get pods  
NAME                               READY     STATUS    RESTARTS   AGE
  
frontend
-server-3958566729-0fwym   1/1       Running   0          2h  
frontend
-server-3958566729-dw937   1/1       Running   0          2h  
redis
-master-1081272834-nyjra      1/1       Running   0          2h  
redis
-slave-3198086074-0ijyl       1/1       Running   0          2h  
redis
-slave-3198086074-6vwya       1/1       Running   0          2h  

[iyunv@kubernetes guestbook]# kubectl scale deployment frontend-server --replicas=1    #replicas 副本数变成1个  
deployment
"frontend-server" scaled  

[iyunv@kubernetes guestbook]# kubectl get pods  
NAME                               READY     STATUS    RESTARTS   AGE
  
frontend
-server-3958566729-0fwym   1/1       Running   0          2h  
redis
-master-1081272834-nyjra      1/1       Running   0          2h  
redis
-slave-3198086074-0ijyl       1/1       Running   0          2h  
redis
-slave-3198086074-6vwya       1/1       Running   0          2h  


静态pod
  是由kubelet进行管理的,仅存在于特定的node上的pod, 他们不能功过API server进行管理,无法于ReplicationController,Deployment或者DaemonSet关联
  kebelet守护进程监控它,并在崩溃时重启它。 静态pod 总是绑定到一个kubulet守护程序上,并且总是运行在同一个节点上。
  创建静态pod的两种方式, 1. 配置文件 ,2.http
  

(1)、创建一个yaml文件,并且放置到一个文件夹中/etc/kubelet.d/
[iyunv@docker225 kubelet.d]# mkdir /etc/kubelet.d/

[iyunv@docker225 kubelet.d]# cat static-web.yaml

  apiVersion: v1
  
kind: Pod
  
metadata:
  name:
static-web  labels:
  role: myrole
  
spec:
  containers:
- name: web  image: nginx
  ports:
- name: web  containerPort:
80  protocol: TCP
  (2) 修改 /etc/kubernetes/kubelet 配置文件,最后一行添加 静态pod的yaml文件的路径。
  KUBELET_ARGS="--pod-manifest-path=/etc/kubelet.d/"
  

(3)重启kulelet 服务  systemctl restart kubelet.service
  

  (4) 删除静态pod, yaml文件去掉后,会自动删除
  mv static-web.yaml     /root/static-web.xml

configmap
  许多应用程序需要通过配置文件,命令行参数和环境变量的组合进行配置。这些配置工件应该与映像内容解耦,以便保持容器化应用程序可移植。ConfigMap API资源提供了使用配置数据注入容器的机制,同时保持容器与Kubernetes无关
  应用部署的一个最佳实践是将应用所需的配置信息与程序进行分离,这样可以使得应用程序被更好的复用,通过不同的配置也能实现更灵活的功能,将应用打包为镜像后,可以通过环境变量或者外挂文件的方式在创建容器时进行配置注入,
  在大规模容器集群的环境中,对多个容器进行不同的配置将变得非常负责, kubernetes提供了一种统一的集群配置管理方案
  configmap 供容器使用的典型方案如下:
  1. 生成为容器内的环境变量
  2. 设置容器启动命令的启动参数
  3. 以volume的形式挂载为容器内部的文件或者目录
  4: 注意必须先创建 configMap, 然后pod 才能创建,如果已经创建的pod,升级,环境变量无法找到,
  一定要做好提前规划。
  

生成为容器内的环境变量
[iyunv@kubernetes configmap]# cat cm-appenv.yaml

  

  apiVersion: v1
  kind: ConfigMap
  metadata:
  name: testenv
  namespace: test
  data:
  mysql_server: 192.168.20.131
  redis_server: 192.168.20.116
  mongo_server: 192.168.20.116
  

  

支持所有的kind类型:如下: china.yaml  

  

  apiVersion: v1
  kind: Service
  metadata:
  name: china
  labels:
  app: china
  spec:
  ports:
  - port: 80
  selector:
  app: china
  ---
  apiVersion: extensions/v1beta1
  kind: Deployment
  metadata:
  name: china
  namespace: test
  spec:
  replicas: 1
  template:
  metadata:
  labels:
  app: china
  spec:
  containers:
  - name: china
  image: docker.cinyi.com:443/senyint/im-web
  ports:
  - containerPort: 80
  env:
  - name: mysql_server
  valueFrom:
  configMapKeyRef:
  name: testenv
  key: mysql_server
  - name: redis_server
  valueFrom:
  configMapKeyRef:
  name: testenv
  key: redis_server
  - name: mongo_server
  valueFrom:
  configMapKeyRef:
  name: testenv
  key: mongo_server
  

[iyunv@kubernetes configmap]# kubectl  create -f cm-appenv.yaml -f china.yaml

  

[iyunv@kubernetes configmap]# kubectl  get pods --all-namespaces -o wide  登陆到pod中,查看env环境变量
  

[iyunv@kubernetes configmap]# kubectl exec -it china-3221241881-rlr8w --namespace=test bash

[iyunv@china-3221241881-rlr8w /]# env | grep -i server

  redis_server=192.168.20.116
  mysql_server=192.168.20.131
  mongo_server=192.168.20.116
  mysql-server=192.168.20.131
  configmap使用 volumeMount模式
  

apiVersion: v1  
kind: ConfigMap
  
metadata:
  name: special
-confignamespace: default  
data:
  special.how: very
  special.type: charm
  

---  

  
apiVersion: v1
  
kind: Pod
  
metadata:
  name: dapi
-test-pod  
spec:
  containers:
- name: test-container  image: docker.cinyi.com:
443/busybox  command: [
"/bin/sh", "-c", "cat /etc/config/special.how" ]  volumeMounts:
- name: config-volume  mountPath:
/etc/config  volumes:
- name: config-volume  configMap:
  name: special
-config  restartPolicy: Never
  


DNS服务
  为了能够通过服务的名字在集群内部进行服务的相互访问,需要创建一个虚拟的dns服务来完成服务名到clusterIP的解析,
  

kubernetes 提供的虚拟dns服务器名为skydns,是由4个组件组成  

1. etc: dns存储  

2. kube2sky: 将kubernetes master 中的service 注册到etcd  

3. skydns 提供dns域名解析服务  

4. healthz: 提供对skydns服务的健康检查功能  


创建skydns的yaml文件
  

apiVersion: v1  
kind: ReplicationController
  
metadata:
  name: kube
-dns-v8namespace: kube-system  labels:
  k8s
-app: kube-dns  version: v8
  kubernetes.io
/cluster-service: "true"  
spec:
  replicas:
1  selector:
  k8s
-app: kube-dns  version: v8
  template:
  metadata:
  labels:
  k8s
-app: kube-dns  version: v8
  kubernetes.io
/cluster-service: "true"  spec:
  containers:
- name: etcd  #image: gcr.io
/google_containers/etcd:2.0.9  image: index.tenxcloud.com
/google_containers/etcd:2.0.9  resources:
  limits:
  cpu: 100m
  memory: 50Mi
  command:
- /usr/local/bin/etcd- -data-dir- /var/etcd/data- -listen-client-urls- http://127.0.0.1:2379,http://127.0.0.1:4001  - -advertise-client-urls
  - http://127.0.0.1:2379,http://127.0.0.1:4001
  - -initial-cluster-token
  - skydns-etcd
  volumeMounts:
  - name: etcd-storage
  mountPath: /var/etcd/data
  - name: kube2sky
  #image: gcr.io/google_containers/kube2sky:1.11
  image: index.tenxcloud.com/google_containers/kube2sky:1.11
  resources:
  limits:
  cpu: 100m
  memory: 50Mi
  args:
  # command = "/kube2sky"
  - -domain=cinyi.com
  - -kube_master_url=http://192.168.20.226:8080
  - name: skydns
  #image: gcr.io/google_containers/skydns:2015-03-11-001
  image: index.tenxcloud.com/google_containers/skydns:2015-03-11-001
  #image: index.tenxcloud.com/google_containers/skydns:2015-10-13-8c72f8c
  resources:
  limits:
  cpu: 100m
  memory: 50Mi
  args:
  # command = "/skydns"
  - -machines=http://localhost:4001
  - -addr=0.0.0.0:53
  - -domain=cinyi.com
  ports:
  - containerPort: 53
  name: dns
  protocol: UDP
  - containerPort: 53
  name: dns-tcp
  protocol: TCP
  volumes:
  - name: etcd-storage
  emptyDir: {}
  dnsPolicy: Default # Don't use cluster DNS.
  
---
  
apiVersion: v1
  
kind: Service
  
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
  k8s-app: kube-dns
  kubernetes.io/cluster-service: "true"
  kubernetes.io/name: "KubeDNS"
  
spec:
  selector:
  k8s-app: kube-dns
  clusterIP: 10.254.0.2
  ports:
  - name: dns
  port: 53
  protocol: UDP
  - name: dns-tcp
  port: 53
  protocol: TCP
  

  

2. 修改每台node 上的 kubelet启动参数  

[iyunv@docker223 ~]# cat /etc/kubernetes/kubelet  
###
  
# kubernetes kubelet (minion) config
  

  
# The address
for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)  
KUBELET_ADDRESS
="--address=0.0.0.0"  

  
# The port
for the info server to serve on  
# KUBELET_PORT
="--port=10250"  

  
# You may leave
this blank to use the actual hostname  
KUBELET_HOSTNAME
="--hostname-override=192.168.20.223"  

  
# location of the api
-server  
KUBELET_API_SERVER
="--api-servers=http://192.168.20.226:8080"  

  
# pod infrastructure container
  
KUBELET_POD_INFRA_CONTAINER
="--pod-infra-container-image=docker.cinyi.com:443/rhel7/pod-infrastructure:latest"  
#KUBELET_POD_INFRA_CONTAINER
="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"  

  
# Add your own
!  
KUBELET_ARGS
="--pod-manifest-path=/etc/kubelet.d/ --cluster_dns=10.254.0.2 --cluster_domain=cinyi.com"  

  DNS工作原理解析:
  1. kube2sky通过调用kubernetes master 的API 获取集群中所有service的信息,并且持续监控新的service 的生成,然后写入etcd中
  查看etcd中存储的service 信息
  

[iyunv@kubernetes nginx]# kubectl exec kube-dns-v8-98n35 -c etcd --namespace=kube-system etcdctl ls /skydns/com/cinyi  

/skydns/com/cinyi/default  
/skydns/com/cinyi/svc
  
/skydns/com/cinyi/kube-system
  查看tomcat1 服务对应的键值:
  

[iyunv@kubernetes nginx]# kubectl exec kube-dns-v8-98n35 -c etcd --namespace=kube-system etcdctl get /skydns/com/cinyi/default/tomcat1

  {"host":"10.254.100.145","priority":10,"weight":10,"ttl":30,"targetstrip":0}
  2. kubelet启动参数设置了(--cluster_dns),kubelet会在每个创建的pod中设置dns解析配置 /etc/resolv.conf
  

[iyunv@docker223 ~]# docker exec -it 2ff /bin/bash  
[iyunv@my-nginx-335071150-a8mak nginx-1.11.2]# cat /etc/resolv.conf
  
search default.svc.cinyi.com svc.cinyi.com cinyi.com
  
nameserver 10.254.0.2
  
nameserver 114.114.114.114
  
options ndots:5
  

  

  3.应用程序能够通过网站域名进行访问。
  

[iyunv@my-nginx-335071150-a8mak nginx-1.11.2]# nslookup tomcat1  
Server:
10.254.0.2  
Address:
10.254.0.2#53  

  
Name:    tomcat1.
default.svc.cinyi.com  
Address:
10.254.100.145  

  例子:查看所有的service 服务


  进入到 pod容器中后 ping kubernetes-dashboard.kube-system 的server,不同,但是可以解析到IP地址

  使用telnet kubernetes-dashboard.kube-system  80端口,是通的,

  结论:service 通过内部IP(虚IP),可以进行通信,但是不能ping通。
  遇到的问题:
  1. ingress  如果使用不同namespace,需要使用2个yaml文件
  2. 配置一个nginx pod,hostNetwork=true的情况下,进入pod中 dns无法解析到其他services,所以直接采用nginx反向代理service方式行不通。 可以是使用问题6的方式,暴露service的nodePort端口。
  3. 容器的hosts: 在dockerfile中,使用add host /etc/,命令,容器启动后,host还是被覆盖
  4. 使用configMap,设置环境变量方式,但是一定要提前规划好,当pod已经创建,再修改configmap文件, 添加环境变量 , 启动的pod,环境变量不启用,需要删除pod,重新创建。
  5. deployment 与 ReplicationController api不同,升级方法不同
  6. DaemoSet类型 实现高可用,需要删除 replicas 参数, 并且设置nodeSelector,只是label, 最后,在node上引用label,kubectl label node docker role=master
  7. 所有操作都是用API,与jenkins结合使用。
  8. k8s 1.5.3以后 skydns 已经取消, 新的 Kubernetes DNS pod拥有3个容器 kubedns,dnsmasq和一个名为healthz的健康检查。kubedns进程监视Kubernetes主服务和端点的更改,并维护内存中查找结构来服务DNS请求。dnsmasq容器添加DNS缓存以提高性能。healthz容器在执行双重健康检查(对于dnsmasq和kubedns)时提供单个健康检查端点。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-431546-1-1.html 上篇帖子: 基于Python+Django的Kubernetes集群管理平台 下篇帖子: centos7上基于kubernetes的docker集群管理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表