使用kubectl创建部署
本文使用自己利用VirtubalBox搭建的集群环境,暂时只有一个Master、一个Node。如果想了解集群的搭建,可以参考我的文章离线环境安装Kubernetes集群以及使用kubeadm安装kubernetes V1.11.1 集群。
0. 目标
在命令行下使用 kubectl 命令创建并管理部署。
1. 检查环境
检查本地的环境信息。
[root@devops-101 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
devops-101 Ready master 7h v1.11.1
devops-102 Ready <none> 6h v1.11.1
2. 命令行方式创建部署
创建Tomcat部署,设置两个副本。
$ kubectl run docker.io/tomcat --replicas=2 --labels="app=tomcat" --image=docker.io/tomcat --port=8080
deployment.apps/tomcat created
[root@devops-101 ~]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
tomcat 2 2 2 2 6m
[root@devops-101 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
tomcat-858b8c476d-vnm98 1/1 Running 0 6m
tomcat-858b8c476d-xl5xl 1/1 Running 0 6m
创建部署之后,可以看到容器已经运行了,但是默认情况下,容器只能内部互相访问,如果需要对外提供服务,有以下几种方式:
- ClusterIP,默认的方式,通过集群IP来对外提供服务,这种方式只能在集群内部访问。
- NodePort,利用NAT技术在Node的指定端口上提供对外服务。外部应用通过:的方式访问。
- LoadBalancer,利用外部的负载均衡设施进行服务的访问。
- ExternalName,这是1.7版本之后 kube-dns 提供的功能。
2.1 端口映射,向外部暴露服务
在Kubernetes中Pod有其自己的生命周期,Node发生故障时,ReplicationController或者ReplicationSet会将Pod迁移到其他节点中以保持用户希望的状态。
[root@devops-101 ~]# kubectl expose deployment/tomcat --type="NodePort" --port 8080
service/tomcat exposed
查看service被映射到哪个端口。
[root@devops-101 ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8h
tomcat NodePort 10.98.152.28 <none> 8080:32050/TCP 7s
因为知道被调度到了102节点,手工通过浏览器打开 http://192.168.0.102:32050 检查服务是否能够正常访问。
3. 基于YAML文件创建部署
首先编辑Yaml文件
apiVersion: v1
kind: Pod
metadata: #元数据信息
name: tomcat-c #kubectl get pods 和 登陆容器显示的名字
labels: #标签,可以作为查询条件 kubectl get pods -l
app=tomcat
node=devops-103
spec: #规格
containers: #容器
- name: tomcat #容器名称
image: docker.io/tomcat #使用的镜像
ports:
- containerPort: 8080
env: #设置env,登陆到容器中查看环境变量, DEME_GREETING 的值是 "hello from the enviroment"
- name:GREETING
value: "hello from the environment"
然后创建Pod。
[root@devops-101 ~]# kubectl create -f tomcat.yaml
pod/tomcat-ccb created
[root@devops-101 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
tomcat-858b8c476d-vnm98 1/1 Running 2 21h
tomcat-858b8c476d-xl5xl 1/1 Running 3 21h
tomcat-ccb 1/1 Running 0 34s
4. 扩容部署
在扩容之前,我把devops-102节点也加入到集群中。
[root@devops-101 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
devops-101 Ready master 9h v1.11.1
devops-102 Ready <none> 8h v1.11.1
devops-103 Ready <none> 7h v1.11.1
然后再执行扩容动作。
[root@devops-101 ~]# kubectl scale deployments/tomcat --replicas=3
deployment.extensions/tomcat scaled
[root@devops-101 ~]# kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
tomcat 3 3 3 2 1h
[root@devops-101 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
tomcat-858b8c476d-cfrtt 0/1 ContainerCreating 0 2m
tomcat-858b8c476d-vnm98 1/1 Running 0 1h
tomcat-858b8c476d-xl5xl 1/1 Running 0 1h
[root@devops-101 ~]# kubectl describe pod tomcat-858b8c476d-cfrtt
Name: tomcat-858b8c476d-cfrtt
Namespace: default
Node: devops-103/192.168.0.103
Start Time: Tue, 24 Jul 2018 18:29:51 +0800
Labels: app=tomcat
pod-template-hash=4146470328
Annotations: <none>
Status: Pending
IP:
Controlled By: ReplicaSet/tomcat-858b8c476d
Containers:
tomcat:
Container ID:
Image: docker.io/tomcat
Image ID:
Port: 8080/TCP
Host Port: 0/TCP
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-trvqv (ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
default-token-trvqv:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-trvqv
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m default-scheduler Successfully assigned default/tomcat-858b8c476d-cfrtt to devops-103
Normal Pulling <invalid> kubelet, devops-103 pulling image "docker.io/tomcat"
5. 缩容
[root@devops-101 ~]# kubectl scale deployments/tomcat --replicas=2
deployment.extensions/tomcat scaled
[root@devops-101 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
tomcat-858b8c476d-vnm98 1/1 Running 0 1h
tomcat-858b8c476d-xl5xl 1/1 Running 0 1h
6. 标签功能
创建部署的时候,kubectl会自动帮我们打一个标签,这里是app=tomcat。
[root@devops-101 ~]# kubectl describe deployment
Name: tomcat
Namespace: default
CreationTimestamp: Tue, 24 Jul 2018 16:35:08 +0800
Labels: app=tomcat
Annotations: deployment.kubernetes.io/revision=1
Selector: app=tomcat
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=tomcat
Containers:
tomcat:
Image: docker.io/tomcat
Port: 8080/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: tomcat-858b8c476d (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 18m deployment-controller Scaled up replica set tomcat-858b8c476d to 3
Normal ScalingReplicaSet 4m deployment-controller Scaled down replica set tomcat-858b8c476d to 2
可以使用标签来查询资源,包括Pods和Services。
[root@devops-101 ~]# kubectl get pods -l app=tomcat
NAME READY STATUS RESTARTS AGE
tomcat-858b8c476d-vnm98 1/1 Running 0 1h
tomcat-858b8c476d-xl5xl 1/1 Running 0 1h
[root@devops-101 ~]# kubectl get services -l app=tomcat
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tomcat NodePort 10.98.152.28 <none> 8080:32050/TCP 1h
可以给Pods打上自定义的标签。
[root@devops-101 ~]# kubectl label --overwrite pod tomcat-858b8c476d-vnm98 node=devops-102
# 这里用了--overwrite属性是因为之前标错了
[root@devops-101 ~]# kubectl describe pods tomcat-858b8c476d-vnm98
Name: tomcat-858b8c476d-vnm98
Namespace: default
Node: devops-102/192.168.0.102
Start Time: Tue, 24 Jul 2018 16:35:08 +0800
Labels: app=tomcat
node=devops-102
pod-template-hash=4146470328
Annotations: <none>
Status: Running
IP: 10.244.2.6
Controlled By: ReplicaSet/tomcat-858b8c476d
Containers:
tomcat:
Container ID: docker://9f3aa2d3d6c1937d4209a44820c1cd06f7eaf8796848c759e19410358aea4866
Image: docker.io/tomcat
Image ID: docker-pullable://docker.io/tomcat@sha256:87ad70ceaafd5c71301b081b37ca2795bd6c7c1a5599a8c92c9447bbd225ae47
Port: 8080/TCP
Host Port: 0/TCP
State: Running
Started: Tue, 24 Jul 2018 16:35:37 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-trvqv (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-trvqv:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-trvqv
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events: <none>
7. 删除部署
$ kubectl delete pod-name

参考资料
使用kubectl创建部署的更多相关文章
- kubectl 创建 Pod 背后到底发生了什么?
原文链接:kubectl 创建 Pod 背后到底发生了什么? 想象一下,如果我想将 nginx 部署到 Kubernetes 集群,我可能会在终端中输入类似这样的命令: $ kubectl run - ...
- Jenkins在Pod中实现Docker in Docker并用kubectl进行部署
Jenkins在Pod中实现Docker in Docker并用kubectl进行部署 准备工作 安装Jenkins Jenkins的kubernetes-plugin使用方法 说明 Jenkins的 ...
- SSAS 部署之创建部署脚本
1.获取多维数据库的结构脚本: 当你的SSAS项目完成后,在Bin目录下会有一个SSAS.asdatabase文件. 2.打开“开始” ->Microsoft SQL Server 2008 R ...
- Jenkins使用五:创建部署任务
创建部署任务 选择运行节点 选择使用shell # 如果是持续进程,这里最好加一个kill进程的命令 判断如果/root/production目录存在,就删除if [ -d /root/product ...
- WebService 的创建,部署和使用
WebService,即Web服务,能使得运行在不同机器上的不同应用无须借助,专门的第三方软件或硬件,就可相互交换数据或集成. 第一次选择WebService,是为了替代数据库远程连接.我们都知道当S ...
- 【转】WebService 的创建,部署和使用
WebService,即Web服务,能使得运行在不同机器上的不同应用无须借助,专门的第三方软件或硬件,就可相互交换数据或集成. 第一次选择WebService,是为了替代数据库远程连接.我们都知道当S ...
- iOS一个项目开始创建, 部署到git服务器
在做iOS开发时, 最开始可能你的经理部署项目, 所以你不会插手, 只是直接从git上clone下来然后就开始撸码, 如果有一天你做经理了, 你怎么去部署一个项目呢, 下面我来过一遍流程 1. 首先需 ...
- Windows Azure 免费初体验 - 创建部署网站
前几天在看到有个学Windows Azure课程,送Windows Azure的活动,课程地址:http://www.microsoftvirtualacademy.com/ 在活得体验资格后,就迫不 ...
- Https:创建部署SSL证书进行双向认证
一.前言 建立客户端与服务器的Https的连接需要证书进行双向验证后,才可访问. 二.证书类型 不同数字证书部署在服务器上后,用户浏览器访问网站时,展示如下: 1.无证书时 显示不安全标识. 2. ...
随机推荐
- 洛谷P4107 [HEOI2015]兔子与樱花 [贪心,DFS]
题目传送门 兔子与樱花 题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1 ...
- 001.WordPress建站部署
一 WordPress简介 WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统( ...
- 大数据小视角4:小议Lambda 与 Kappa 架构,不可变数据的计算探索
这个系列文章之前因为私事荒废了很久,继续更新--之前与老大谈论架构时,老大和我聊了聊分布式数据处理之中的Lambda结构,之前在<Designing Data-Intensive Applica ...
- java List/ArrayList 解惑
导读:祖传挖坟派学习方法(宝儿姐友情支持) 第一部分 List简介 第二部分 何为ArrayList 第三部分 代码示例 第四部分 吹牛 如果你急需想搞清楚一些问题可以先看这里的总结 再后续看 ...
- Codeforces.1041F.Ray in the tube(思路)
题目链接 \(Description\) 有两条平行于\(x\)轴的直线\(A,B\),每条直线上的某些位置有传感器.你需要确定\(A,B\)轴上任意两个整点位置\(x_A,x_B\),使得一条光线沿 ...
- C++最快的读取文件的方案(scanf,cin(及取消sync),fread)的详细对比
竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式.相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据.还有人说Pascal的rea ...
- 钻牛角尖还是走进死胡同--shell脚本根据名称获得 dubbo 服务的 pid
到了下午,突然觉得坐立不安,可能是因为中午没有休息好.老大不小了还在做页面整合的事情,这是参加工作时就干的工作了.然后突然想去挑战高级一点的缺陷排查,结果一不小心就钻了一个牛角尖.启动 dubbo 服 ...
- 二分法(折半查找法)小demo
使用此算法,必须有一个前提,那就是数组必须是有序的. package com.ly.tcwireless.international.test; import org.junit.Test; publ ...
- BrowserLog——使用Chrome控制台作为Log查看器
Chrome控制台是十分强大的,即使将它作为一个log查看器也是非常强大的,BrowserLog就是一个.net下的把Chrome作为log输出的程序包. 原理非常简单,server端将log数据通过 ...
- 【Go命令教程】4. go get
hc@ubt:~$ go get github.com/hyper-carrot/go_lib/logging 命令 go get 可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并 ...