Kubernetes学习之二:Hello K8S

我们学习语言第一个想法就是在环境搭建好了之后写一个Helloworld,我们学习如何在 k8s 上部署应用时,部署一个简单的 nginx,能够访问到它的配置页面。由于它五脏俱全,功能简单,无状态,可以当做 k8s 部署应用的 hello, world:

实验目的:

利用ingress-nginx暴露服务供外网访问,版本:0.30.0


实验步骤:

1,下载ingress-nginx安装配置文件

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml -O ingress-nginx.yaml

2,在ingress-nginx.yaml文件最后增加service的安装配置

---
apiVersion: v1
kind: Service
metadata:
    name: ingress-nginx
    namespace: ingress-nginx
    labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
spec:
    type: NodePort
    ports:
        - name: http
          port: 80
          targetPort: 80
          nodePort: 30010
          protocol: TCP
        - name: https
          port: 443
          targetPort: 443
          nodePort: 30011
          protocol: TCP
selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

3,安装ingress-nginx,安装了namespace,nginx-ingress-controller,ingress-nginx

kubectl apply -f ingress-nginx.yaml

输出:
namespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
Warning: rbac.authorization.k8s.io/v1beta1 Role is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 Rolerole.rbac.authorization.k8s.io/nginx-ingress-role created
Warning: rbac.authorization.k8s.io/v1beta1 RoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 RoleBindingrolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBindingclusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding createddeployment.apps/nginx-ingress-controller created
limitrange/ingress-nginx created
service/ingress-nginx created

4,查看安装结果:
     1,namespace是k8s的命名空间,旨在对一组资源和对象创建一个抽象空间集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pod, service, replication controller 和 deployment 等都是属于某一个 namespace 的(默认是 default);
     2,pod是一组紧密关联的容器集合,Pod就是共享IPC、Network和UTS namespace,是K8S调度的基本单位。Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。这个容器就是ingress-nginx的控制器;
     3,service是对一组提供相同功能的 Pods 的抽象,并为它们提供一个统一的入口。借助 Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service 通过标签来选取服务后端,一般配合 Replication Controller 或者 Deployment 来保证后端容器的正常运行。这些匹配标签的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上。Service有四种类型(ClusterIP,NodePort,LoadBalancer,ExternalName)为对外暴露的接口,说明了集群的机器均对外暴露30010和30011两个接口;

//查看namespace
kubectl get namespaces
NAME STATUS AGE
default Active 7d18h
ingress-nginx Active 22s
kube-node-lease Active 7d18h
kube-public Active 7d18h
kube-system Active 7d18h
kubernetes-dashboard Active 41h

//查看pod
kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-54b86f8f7b-lghw4 1/1 Running 0 66s

//查看service
kubectl get services -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.1.64.186 <none> 80:30010/TCP,443:30011/TCP 75s

5,安装nginx pod并暴露80端口:

//nginx.yaml
apiVersion: v1
kind: Pod
metadata:
     name: nginx
     # 指定 label,便于检索
     labels:
        app: nginx
spec:
    containers:
    - name: nginx
    # 指定镜像
    image: nginx:alpine
    # 指定暴露端口
    ports:
    - containerPort: 80

//使用kubectl apply,部署 Pod
kubectl apply -f nginx.yaml
pod/nginx created

//校验部署状态,此时 STATUS 为 Running 表明部署成功
kubectl get pods nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 43h 10.244.3.4 pcno4 <none> <none>

//获取更加详细的信息
kubectl describe pod nginx
Name: nginx
Namespace: default
Priority: 0
Node: pcno4/10.10.30.74
Start Time: Wed, 06 Jan 2021 15:16:28 +0800
Labels: app=nginx
Annotations: <none>
Status: Running
IP: 10.244.3.4
IPs:
    IP: 10.244.3.4
Containers:
    nginx:
        Container ID: docker://fa7b8ef84d0c2cb9bc3c7bc1bab7e94912fecada7f901f762da3898a8bcf65cc
        Image: nginx:alpine
        Image ID: docker-pullable://nginx@sha256:c2ce58e024275728b00a554ac25628af25c54782865b3487b11c21cafb7fabda
        Port: 80/TCP
        Host Port: 0/TCP
        State: Running
           Started: Wed, 06 Jan 2021 15:16:47 +0800
        Ready: True
        Restart Count: 0
        Environment: <none>
        Mounts:
             /var/run/secrets/kubernetes.io/serviceaccount from default-token-k9grl (ro)
Conditions:
    Type Status
    Initialized True
    Ready True
    ContainersReady True
    PodScheduled True
Volumes:
    default-token-k9grl:
        Type: Secret (a volume populated by a Secret)
        SecretName: default-token-k9grl
        Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations:
    node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
    node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events: <none>

每个 pod 都有一个IP地址,直接访问IP地址获取内容
curl 10.244.3.4
<!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 andworking. 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>

6,此时我们可以使用 kubectl exec 进入 Pod 的内部容器。如果 Pod 中有多个容器,使用 kubectl exec -c 指定容器

kubectl exec -it nginx sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead./ # vim /usr/share/nginx/html/index.html
//修改index.html文件改成自己希望加入的内容,然后退出重新使用curl命令查看
curl 10.244.3.4
#可以看到修改过的页面
//进入pod还可以查看网络情况,如下:
netstat -tan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTENtcp 0 0 :::80 :::* LISTEN
wget -q -O - localhost
#可以看到页面文件内容

7,部署nginx至集群,在k8s中管理 Pod 的称作 Controller,我们可以使用 Deployment 这种 Controller 来为 Pod 进行扩容,当然它还可以滚动升级,回滚等等关于部署的事情,我们编写一个Deployment的资源配置文件

//nginxdelop.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
     name: nginx-deployment
spec:
     #定位需要管理的Pod
     selector: 
         matchLabels:
              app: nginx
     #需要部署的个数
     replicas: 3
     #指定要部署的Pod
     template:
        metadata:
             labels:
                app: nginx
        spec:
            containers:
            - name: nginx
              image: nginx:alpine
              ports:
              - containerPort: 80
//kubectl apply 部署生效后查看 Pod 以及 Deployment 状态
kubectl get pods -o wide -l 'app=nginx'
//nginx-deployment 部署的三个 pod 全部成功
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 46h 10.244.3.4 pcno4 <none> <none>
nginx-deployment-7fb7fd49b4-b6tcw 1/1 Running 0 46h 10.244.3.5 pcno4 <none> <none>
nginx-deployment-7fb7fd49b4-jxdx2 1/1 Running 0 46h 10.244.1.4 pcno5 <none> <none>
nginx-deployment-7fb7fd49b4-spxgr 1/1 Running 0 46h 10.244.1.5 pcno5 <none> <none>
//READY 3/3 表明全部部署成功
kubectl get deploy nginx-deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 46h

8,现在部署的这个nginx[pod],对应第二步里建立的ingress-nginx的service,这样就可以通过下面的渠道被访问了:

集群对外的ip(机器ip:10.10.30.76:80)--> ingress(ingress-nginx NodePort ClusterIP: 10.1.64.186:30010/30011) --> nginx-service(CluserIP:10.1.169.124:80) --> nginx-deployment(IP:10.244.1.4/1.5/3.5/

10.10.30.76:30010 --|                                                                                                                                  |-> 10.244.1.4:80
                        [serive:NodePort:ingress-nginx]   [pod:nginx-ingress-controller]    [service:nginx-service]
                                  |      10.1.64.186       |    -->   |     10.244.1.7:80    |     -->    |      10.1.169.124:80     |-> 10.244.1.5:80
10.10.30.75:30010 --|                                                                                                                                  |-> 10.244.3.4:80
10.10.30.74:30010 --|                                                                                                                                  |-> 10.244.3.5:80

9,最后可以通过集群外机器直接用ip访问(如果进入不同nginxpod机器修改不同的nginx主页,然后多次访问就能看出集群的负载均衡在自动调用不同的node处理)如下:

//编辑所有的pods,将内部部署的网页全部添加node和ip相关的信息
kubectl exec -it nginx sh  #10.244.3.4 pcno4 根据第7步kubectl get pods -o wide -l 'app=nginx'命令的结果添加node和ip信息
kubectl exec -it nginx-deployment-7fb7fd49b4-jxdx2 sh     #10.244.3.5 pcno4
kubectl exec -it nginx-deployment-7fb7fd49b4-b6tcw sh    #10.244.1.4 pcno5
kubectl exec -it nginx-deployment-7fb7fd49b4-spxgr sh     #10.244.1.5 pcno5

//在外网访问,可以看到四个不同的node的信息
curl http://10.10.30.76(75|74):30010 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容

  • Ingress概述 Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP和...
    联旺阅读 565评论 0 0
  • 提示:如上图所示,ingress就是ingress 控制器pod的代理规则;用户请求某个后端pod所提供的服务时,...
    金色888阅读 585评论 0 0
  • 容器技术概念入门篇 从进程说开去 容器本身没有价值,有价值的是“容器编排”。 容器其实是一种沙盒技术。顾名思义,沙...
    白板时钟阅读 2,339评论 0 1
  • k8s Ingress 服务部署方式 通常情况下,service和pod仅可在集群内部网络中通过IP地址访问。所有...
    张家锋阅读 3,638评论 0 1
  • k8s环境搭建 文档介绍在Docker for mac中的k8s如何把环境搭建好。 清单: docker for ...
    Carltony阅读 1,356评论 0 0