kubectl 就是 api server的客户端工具

创建一个nginx的pod

[root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx-deploy created

查看pod状态

[root@master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 1/1 1 1 54s

[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deploy-55d8d67cf-xdxcj 1/1 Running 0 85s

[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-55d8d67cf-xdxcj 1/1 Running 0 2m4s 10.244.1.2 node1 <none> <none>

[root@node1 ~]# ifconfig
cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
  inet 10.244.1.1 netmask 255.255.255.0 broadcast 0.0.0.0
  inet6 fe80::ac25:6fff:fe19:4a09 prefixlen 64 scopeid 0x20<link>
  ether ae:25:6f:19:4a:09 txqueuelen 1000 (Ethernet)
  RX packets 1 bytes 28 (28.0 B)
  RX errors 0 dropped 0 overruns 0 frame 0
  TX packets 8 bytes 656 (656.0 B)
  TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

10.244.1.1这个网段是24位掩码,因此10.244.1都是网络地址,它是整个大网10.244.0.0/16位掩码的一个子网。这个子网专供node1上的pod使用。
node2上面的都是10.244.2.1开始。和node1不冲突。

[root@node2 ~]# curl 10.244.1.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
  body {
    width: 35em;
    margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif;
  }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

这时说明nginx的pod已经运行起来了。

这时的nginx只能被集群内部访问,还没法对外,所以需要创建service层来代理。

[root@master ~]# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP
service/nginx exposed

把deployment控制器相关的pod资源都创建为一个服务nginx-deploy,而服务名字叫nignx ,服务的端口号为80,pod的端口号,TCP服务。默认用的是Cluster-IP

[root@master ~]# kubectl get svc (svc是services的简写)
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d
nginx ClusterIP 10.96.69.143 <none> 80/TCP 3m24s

nginx的CLUSTER-IP是动态生成的,10.96.69.143是10.96.0.0/12位掩码中的地址。暴露的地址是80端口。

[root@master ~]# curl 10.96.69.143
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
  body {
    width: 35em;
    margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif;
  }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

这时候,访问service的地址就可以访问nginx了,依然在外部是访问不到的,因为创建service的时候用的是默认的CLUSTER-IP模式,是被集群内部pod客户端访问的。基于service自己的名称所访问的。

[root@master ~]# curl nginx
curl: (6) Could not resolve host: nginx; 未知的名称或服务

这时还是必须指定IP地址才能访问,因为还没有用DNS解析IP地址呢。所以需要去解析IP地址,这样以后直接访问ningx服务名就行了不用理IP地址。

查看DNS的地址:

[root@master ~]# kubectl get pods -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-fb8b8dccf-8lczd 1/1 Running 1 3d 10.244.0.5 master <none> <none>
coredns-fb8b8dccf-rljmp 1/1 Running 1 3d 10.244.0.4 master <none> <none>
etcd-master 1/1 Running 3 3d 192.168.163.100 master <none> <none>
kube-apiserver-master 1/1 Running 4 3d 192.168.163.100 master <none> <none>
kube-controller-manager-master 1/1 Running 9 3d 192.168.163.100 master <none> <none>
kube-flannel-ds-amd64-26kk7 1/1 Running 1 26h 192.168.163.102 node2 <none> <none>
kube-flannel-ds-amd64-428x9 1/1 Running 1 26h 192.168.163.101 node1 <none> <none>
kube-flannel-ds-amd64-mj4s6 1/1 Running 1 28h 192.168.163.100 master <none> <none>
kube-proxy-5s2gz 1/1 Running 1 26h 192.168.163.101 node1 <none> <none>
kube-proxy-lwntd 1/1 Running 3 3d 192.168.163.100 master <none> <none>
kube-proxy-tjcpd 1/1 Running 1 26h 192.168.163.102 node2 <none> <none>
kube-scheduler-master 1/1 Running 8 3d 192.168.163.100 master <none> <none>

[root@master ~]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3d

安装解析命令:

[root@master ~]# yum -y install bind-utils

创建一个临时的客户端进去设置DNS
[root@master ~]# kubectl run client1 --image=busybox --replicas=1 -it --restart=Never
If you don't see a command prompt, try pressing enter.
/ # cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

default.svc.cluster.local 是一个特殊域名, 表示是你的kubenetes集群的本地pod资源特定后缀,而default表示这个pod所属的名称空间的名字,如果不给完整的名称,搜索的时候就搜索的域就不一样。

[root@master ~]# dig -t A nginx.default.svc.cluster.local @10.96.0.10

; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> -t A nginx.default.svc.cluster.local @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18720
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;nginx.default.svc.cluster.local. IN A

;; ANSWER SECTION:
nginx.default.svc.cluster.local. 5 IN A 10.96.69.143

;; Query time: 3 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: 四 5月 16 10:05:59 CST 2019
;; MSG SIZE rcvd: 107

[root@master ~]# kubectl run client1 --image=busybox --replicas=1 -it --restart=Never
If you don't see a command prompt, try pressing enter.
/ # cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
/ # nslookup nginx
Server: 10.96.0.10
Address: 10.96.0.10:53

Name: nginx.default.svc.cluster.local
Address: 10.96.69.143

*** Can't find nginx.svc.cluster.local: No answer
*** Can't find nginx.cluster.local: No answer
*** Can't find nginx.default.svc.cluster.local: No answer
*** Can't find nginx.svc.cluster.local: No answer
*** Can't find nginx.cluster.local: No answer

/ # wget nginx
Connecting to nginx (10.96.69.143:80)
index.html 100% |**********************************| 612 0:00:00 ETA
/ # wget -O - -q http://nginx:80/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
  body {
    width: 35em;
    margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif;
  }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

这时已经解析成功,可以通过服务名ningx访问了。

为了测试是否成功,先删除pod试试看,看看在起来的pod是否能通过服务名访问。

[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client1 1/1 Running 0 18m
nginx-deploy-55d8d67cf-xdxcj 1/1 Running 0 57m

[root@master ~]# kubectl delete pods nginx-deploy-55d8d67cf-xdxcj
pod "nginx-deploy-55d8d67cf-xdxcj" deleted

[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client1 1/1 Running 0 19m
nginx-deploy-55d8d67cf-9rm67 0/1 ContainerCreating 0 22s

这时新的pod已经创建成功了。通过临时客户端在去访问服务名看看是否能联通。

/ # wget -O - -q http://nginx:80/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
  body {
    width: 35em;
    margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif;
  }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

发现还是可以发现。没有问题。

[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d
nginx ClusterIP 10.96.69.143 <none> 80/TCP 43m

[root@master ~]# kubectl describe svc nginx
Name:  nginx
Namespace:  default
Labels:    run=nginx-deploy
Annotations:   <none>
Selector:    run=nginx-deploy
Type:    ClusterIP
IP:    10.96.69.143
Port:   <unset> 80/TCP
TargetPort:    80/TCP
Endpoints:   10.244.2.3:80
Session Affinity:   None
Events:   <none>

[root@master ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
client1 1/1 Running 0 27m run=client1
nginx-deploy-55d8d67cf-9rm67 1/1 Running 0 8m18s pod-template-hash=55d8d67cf,run=nginx-deploy

可以得出结论是根据标签选中的,而不是根据IP地址选中的。

删除服务以后,在从新起个服务,发现客户端还是能直接发现nginx服务的。
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d1h
nginx ClusterIP 10.96.69.143 <none> 80/TCP 58m
[root@master ~]# kubectl delete svc nginx
service "nginx" deleted
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d1h
[root@master ~]# kubectl expose deployment nginx-deploy --name=nginx
service/nginx exposed
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d1h
nginx ClusterIP 10.104.156.118 <none> 80/TCP 7s

/ # wget -O - -q http://nginx:80/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
  body {
    width: 35em;
    margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif;
  }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

只要服务在,就可以正确的反应到DNS上的。

查看控制器的详细信息:

[root@master ~]# kubectl describe deployment nginx-deploy
Name:    nginx-deploy
Namespace:   default
CreationTimestamp:   Thu, 16 May 2019 08:41:11 +0800
Labels:   run=nginx-deploy
Annotations:    deployment.kubernetes.io/revision: 1
Selector:    run=nginx-deploy
Replicas:    1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:   RollingUpdate
MinReadySeconds:    0
RollingUpdateStrategy:    25% max unavailable, 25% max surge
Pod Template:
  Labels:    run=nginx-deploy
  Containers:
   nginx-deploy:
 Image:    nginx:1.14-alpine
 Port:   80/TCP
 Host Port:   0/TCP
 Environment:    <none>
 Mounts:    <none>
  Volumes:   <none>
Conditions:
 Type Status Reason
 ---- ------ ------
 Progressing True NewReplicaSetAvailable
 Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deploy-55d8d67cf (1/1 replicas created)
Events: <none

-w 表示监控进度

pod也是可以动态扩展的。当然也可以动态缩减,直接修改要改成的几,例如像缩减成3个。就把下面图片的改成 --replicas=3 就可以了

动态升级:

[root@master ~]# kubectl set image -h
Usage:
  kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1
  ... CONTAINER_NAME_N=CONTAINER_IMAGE_N [options]

TYPE NAME 表示哪个pod
CONTAINER_NAME_1=CONTAINER_IMAGE_1 表示哪个容器替换成哪个镜像

比如像替换myapp-848b5b879b-gxxtc容器

通过kubectl describe pods 可以查看容器的各种信息,包括容器名字等等。

把v1版本升级成v2版本。第一个myapp是控制器的名字,第二个myapp是容器名

kubectl rollout status deployment myapp 可以查看更新的过程。

使用上面的命令在查看就可以看到是v2版本了。

也可以进行回滚操作:

kubectl rollout undo deployment myapp 回滚的时候可以指定回滚到哪个版本。不指定就默认回滚到上个版本。

如果想集群外部访问nginx的话,只需要修改service类型为NodeProt即可。

[root@master ~]# kubectl edit svc nginx
metadata:
  creationTimestamp: "2019-05-16T02:02:30Z"
  labels:
    run: nginx-deploy
  name: nginx
  namespace: default
  resourceVersion: "51839"
  selfLink: /api/v1/namespaces/default/services/nginx
  uid: a94b9787-777e-11e9-833b-000c29ac207f
spec:
  clusterIP: 10.104.156.118
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 31998
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx-deploy
  sessionAffinity: None
  type: NodePort //这里修改成NodePort就可以外部访问了
status:
  loadBalancer: {}

[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d2h
nginx NodePort 10.104.156.118 <none> 80:31998/TCP 67m

可以看到了多了一个端口。这个端口就是外部访问的端口

可以看到通过浏览器访问node2节点的IP地址和31998端口号就可以外部进行访问nginx了。

kubernetes快速应用入门的更多相关文章

  1. Kubernetes快速入门

    二.Kubernetes快速入门 (1)Kubernetes集群的部署方法及部署要点 (2)部署Kubernetes分布式集群 (3)kubectl使用基础 1.简介 kubectl就是API ser ...

  2. codevs3500 快速幂入门题解

    codevs3500 快速幂入门题解 //我也是抄的题解 题目描述 Description 输入3个数a,b,c,求a^b mod c=? 输入描述 Input Description 三个数a,b, ...

  3. smarty半小时快速上手入门教程

    http://www.jb51.net/article/56754.htm http://www.yiibai.com/smarty/smarty_functions.html http://www. ...

  4. EFCodeFirst快速搭建入门

    EFCodeFirst快速搭建入门 1.新建Model类库项目. 添加EntityFramework.dll的引用. 编写实体类Course,Student. namespace EFCodeFirs ...

  5. (三)Kubernetes 快速入门

    Kubernetes的核心对象 API Server提供了RESTful风格的编程接口,其管理的资源是Kubernetes API中的端点,用于存储某种API对象的集合,例如,内置Pod资源是包含了所 ...

  6. 第二章 Kubernetes快速入门

    一.四组基本概念 Pod/Pod控制器: Name/Namespace: Label/Label选择器: Service/Ingress. 二.Pod/Pod控制器 2.1 Pod Pod是K8S里能 ...

  7. 【译】Hello Kubernetes快速交互实验手册

    原文:https://kubernetes.io/docs/tutorials 翻译:Edison Zhou 一.基本介绍 此交互实验可以让你不用搭建K8S环境就可以轻松地尝试管理一个简单的容器化应用 ...

  8. Kubernetes服务发现入门:如何高效管理服务?

    愈发复杂的应用程序正在依靠微服务来保持可扩展性和提升效率.Kubernetes为微服务提供了完美的环境,并能够让其与Kubernetes的工具组件和功能兼容.当应用程序的每个部分放置在一个容器中,整个 ...

  9. Python快速编程入门,打牢基础必须知道的11个知识点 !

    Python被誉为全世界高效的编程语言,同时也被称作是“胶水语言”,那它为何能如此受欢迎,下面我们就来说说Python入门学习的必备11个知识点,也就是它为何能够如此受欢迎的原因. Python 简介 ...

随机推荐

  1. 【NOIP2016提高A组集训第14场11.12】随机游走

    题目 YJC最近在学习图的有关知识.今天,他遇到了这么一个概念:随机游走.随机游走指每次从相邻的点中随机选一个走过去,重复这样的过程若干次.YJC很聪明,他很快就学会了怎么跑随机游走.为了检验自己是不 ...

  2. php四种基础算法:冒泡,选择,插入和快速排序法PHP基础教程

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西.但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌 ...

  3. luogu 4059 [Code+#1]找爸爸 动态规划

    Description 小A最近一直在找自己的爸爸,用什么办法呢,就是DNA比对.小A有一套自己的DNA序列比较方法,其最终目标是最 大化两个DNA序列的相似程度,具体步骤如下:1.给出两个DNA序列 ...

  4. UNIX标准C - 进程之间的通信

    一.基本概念 进程间通信IPC:进程之间交换数据的过程叫进程间通信 进程间同性的方式: 简单的进程间的通信: 命令行:父进程通过exec函数创建子进程是可以附加一些数据 环境变量表:父进程通过exec ...

  5. Codeforces 939E Maximize ( 三分 || 二分 )

    题意 : 给出两个操作,① 往一个序列集合(初始为空)里面不降序地添加数字.② 找出当前序列集合的一个子集使得 (子集的最大元素) - (子集的平均数) 最大并且输出这个最大差值 分析 :  首先关注 ...

  6. 为什么C++中只有指针和引用才能实现多态?

    代码: class A { public: virtual void Debug(){} }; class B:public A { public: virtual void Debug(){} }; ...

  7. Qt类图

    Qt对象命名与类图 QWidget=Windows get,即获得窗体,凡是我们能看到的界面都是从QWidget继承而来的. QDialog QAbstractButton 这是一个抽象类,不能直接使 ...

  8. 【Leetcode】最长回文子串

    启发 1)做题前一定要读懂题目 在本题中,首先要清楚地定义回文子串的概念,然后才能设计算法查找它. 如中心扩散法,其主要思想在于找到一个回文子串的定义——两侧互为镜像.进一步分为奇数长度和偶数长度进行 ...

  9. sweetalert2 全面替代 alert ,从 sweetalert2 弹出 text 到 弹出 Dom 以及模态框和取消 sweetalert2 的 OK 按钮

    1. 简易基本版 sweetalert 涵盖日常基本的弹出及对话框 2. 升级版本 sweetalert2 满足常见开发工作中的各种要求 3 取消 OK 按钮, 只需要设置 showConfirmBu ...

  10. Android应用源码航空订票软件客户端

    功能分类:其他     支持平台:Android     运行环境:Android 开发语言:Java     开发工具:Eclipse     源码大小:1.76MB   下载地址:http://w ...