Kubernetes:应用部署、应用了解、应用公布、应用伸缩,-image=ikubernetes/myapp:v1

本文详细介绍如何在Kubernetes中部署Nginx应用,包括创建Deployment、Service,通过内部IP和DNS访问应用,以及如何进行应用的伸缩操作。

k8s基础命令:https://kubernetes.io/zh/docs/reference/kubectl/kubectl-cmds/

k8s基础知识:https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/

一,部署应用

kubectl create deployment my-test-ngx --image=nginx
deployment.apps/my-test-ngx created

二,了解应用

查看deployment

kubectl get deployment
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
my-test-ngx   1/1     1            1           103s

 

get deployment -o wide
NAME          READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES   SELECTOR
my-test-ngx   1/1     1            1           2m17s   nginx        nginx    app=my-test-ngx

查看pod

kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
my-test-ngx-77d994d88-srhzm   1/1     Running   0          39s

 

kubectl get pod -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP           NODE                   NOMINATED NODE   READINESS GATES
my-test-ngx-77d994d88-srhzm   1/1     Running   0          2m54s   10.244.0.7   master.oopxiajun.com   <none>           <none>

利用这个IP我们访问下

curl 10.244.0.7
<!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>

本机浏览器也是可以访问

 

三,公布应用

kubectl create service clusterip my-test-ngx --tcp=8001:80
service/my-test-ngx created

这里注意:

1:my-test-ngx 这个名字需要与svc 的名字一样。

2:--tcp=8001:80 这里8001是公布对外的端口,80是容器内部端口

我看看svc详细信息

kubectl describe svc/my-test-ngx
Name:              my-test-ngx
Namespace:         default
Labels:            app=my-test-ngx
Annotations:       <none>
Selector:          app=my-test-ngx
Type:              ClusterIP
IP:                10.105.139.80
Port:              8001-80  8001/TCP
TargetPort:        80/TCP
Endpoints:         10.244.0.7:80
Session Affinity:  None
Events:            <none>

可以看到IP:                10.105.139.80

curl 10.105.139.80:8001
<!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>

可以访问到这个IP:port对应的容器信息

删掉pod,看看有什么不一样。

#看看pod名
kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
my-test-ngx-77d994d88-srhzm   1/1     Running   0          28m
#删掉pod
[root@master xiajun]# kubectl delete pod my-test-ngx-77d994d88-srhzm 
pod "my-test-ngx-77d994d88-srhzm" deleted

#再次看看pod
[root@master xiajun]# kubectl get pod
NAME                          READY   STATUS              RESTARTS   AGE
my-test-ngx-77d994d88-vsrwf   0/1     ContainerCreating   0          14s

#发现pod名字变了

pod删掉后,又建了一个,pod名字变了,不仅仅是pod名字变了,容器的ip也有变化

kubectl describe svc/my-test-ngx
Name:              my-test-ngx
Namespace:         default
Labels:            app=my-test-ngx
Annotations:       <none>
Selector:          app=my-test-ngx
Type:              ClusterIP
IP:                10.105.139.80
Port:              8001-80  8001/TCP
TargetPort:        80/TCP
Endpoints:         10.244.0.8:80
Session Affinity:  None
Events:            <none>

前面我们看到:Endpoints:         10.244.0.7:80

这是我们看到:Endpoints:         10.244.0.8:80 

Name:              my-test-ngx
Namespace:         default
Labels:            app=my-test-ngx
Annotations:       <none>
Selector:          app=my-test-ngx
Type:              ClusterIP
IP:                10.105.139.80
Port:              8001-80  8001/TCP
TargetPort:        80/TCP
Endpoints:         10.244.0.14:80
Session Affinity:  None
Events:            <none>

但是IP:10.105.139.80 是沒变的。所以pod即使是被干掉了,或者某个node的挂掉了,甚至是关机、重启宿主机,我们也一样是可以通过这个ip:port访问的。

curl 10.105.139.80:8001
<!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>

很遗憾:这个地址也只能本机访问,用域名也是无法访问的。

curl my-test-ngx
curl: (6) Could not resolve host: my-test-ngx

用k8s本地的域名也是不行的。

curl my-test-ngx.default.svc.cluster.local.
curl: (7) Failed to connect to my-test-ngx.default.svc.cluster.local port 80: Connection refused

那我们怎么才能让应用公布到外网呢?

这里有一个叫kube-dns的svc,

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   30h

说明k8s有个dns服务器,其ip地址为10.96.0.10

那么我们是否可以将作为我们宿主机的dns服务器呢?我们来试试。

cat /etc/resolv.conf 
# Generated by NetworkManager
search localdomain oopxiajun.com
nameserver 192.168.134.2

这儿我们看到了我们nameserver是192.168.134.2

我们改下这个nameserver

vim /etc/resolv.conf
# Generated by NetworkManager
search localdomain oopxiajun.com
nameserver 10.96.0.10

然后访问

curl my-test-ngx.default.svc.cluster.local.
<!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>

浏览器中也可以了

这样还是不够的哦。

观察下这个域名 my-test-ngx.default.svc.cluster.local

my-test-ngx:是service的名称,

default:是命名空间

svc.cluster.local:是k8s固定的dns-domain格式

我们要将这个域名改为我们自己定义的就需要在 kubeadm init 是 加入我们的参数  --service-dns-domain 

如果不加这个 --service-dns-domain  ,那么默认的dns-domain就是svc.cluster.local.

这个点我们后面再来详细研究。

四,伸缩引用

我们这儿举例 就用 k8s 提供的一个镜像 ikubernetes/myapp 

#部署
kubectl create deployment myapp-test --image=ikubernetes/myapp:v1
deployment.apps/myapp-test created

#公布节点
kubectl create service clusterip  myapp-test --tcp=80:80 
service/myapp-test created

#访问
[root@master xiajun]# curl myapp-test.default.svc.cluster.local.
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

#hostname.html 中就是 pod的名称
curl myapp-test.default.svc.cluster.local./hostname.html
myapp-test-cc8865788-6s9xh

kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
my-test-ngx-77d994d88-f99lf   1/1     Running   0          36m
myapp-test-cc8865788-6s9xh    1/1     Running   0          2m16s

扩容

kubectl scale --replicas=3 deployment myapp-test
deployment.apps/myapp-test scaled

访问

kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
my-test-ngx-77d994d88-f99lf   1/1     Running   0          43m
myapp-test-cc8865788-6s9xh    1/1     Running   0          9m2s
myapp-test-cc8865788-dw6nc    1/1     Running   0          33s
myapp-test-cc8865788-xw2mw    1/1     Running   0          33s
[root@master xiajun]# curl myapp-test.default.svc.cluster.local./hostname.html
myapp-test-cc8865788-6s9xh
[root@master xiajun]# curl myapp-test.default.svc.cluster.local./hostname.html
myapp-test-cc8865788-6s9xh
[root@master xiajun]# curl myapp-test.default.svc.cluster.local./hostname.html
myapp-test-cc8865788-6s9xh
[root@master xiajun]# curl myapp-test.default.svc.cluster.local./hostname.html
myapp-test-cc8865788-xw2mw
[root@master xiajun]# curl myapp-test.default.svc.cluster.local./hostname.html
myapp-test-cc8865788-dw6nc
[root@master xiajun]# curl myapp-test.default.svc.cluster.local./hostname.html
myapp-test-cc8865788-6s9xh
[root@master xiajun]# curl myapp-test.default.svc.cluster.local./hostname.html
myapp-test-cc8865788-dw6nc
[root@master xiajun]# curl myapp-test.default.svc.cluster.local./hostname.html
myapp-test-cc8865788-xw2mw
[root@master xiajun]# curl myapp-test.default.svc.cluster.local./hostname.html
myapp-test-cc8865788-6s9xh
[root@master xiajun]# curl myapp-test.default.svc.cluster.local./hostname.html
myapp-test-cc8865788-dw6nc

可以看到是随机访问了pod

 

在云端部署应用程序和服务通常涉及多个步骤,从规划与设计到实施与优化,整个过程需要考虑架构设计、资源配置、安全策略、自动化运维等多个方面。以下是详细的流程和最佳实践。 ### 云平台部署应用系统服务的流程 1. **需求分析与架构设计** 在部署之前,需要明确应用的功能需求、性能目标、安全要求以及可扩展性。基于这些需求,设计系统的整体架构,包括前端、后端、数据库、缓存、负载均衡、网络拓扑等。架构设计应遵循高可用性、弹性扩展和容错机制的原则。 2. **选择合适的云服务提供商** 根据应用部署需求选择合适的云平台。不同云服务商提供的计算、存储、数据库、AI/ML等服务各有优势。例如,华为云提供SAP HANA弹性云服务器单节点部署、裸金属服务器部署等方案,适合企业级数据库应用部署[^1]。 3. **资源配置与虚拟化环境准备** 在云平台上创建所需的计算资源(如虚拟机或容器)、网络资源(如VPC、子网、安全组)和存储资源(如对象存储、块存储)。对于SAP HANA等关键业务系统,建议使用裸金属服务器以获得更高的性能和稳定性[^1]。 4. **部署应用环境** 在准备好的云资源上安装操作系统、运行时环境(如Java、Python、Node.js)、数据库、中间件等。可以使用基础设施即代码(IaC)工具如Terraform、CloudFormation进行自动化部署,确保环境一致性。 5. **容器化与微服务部署** 使用Docker容器化应用,并通过Kubernetes进行编排管理,实现服务的自动扩缩容、负载均衡和故障恢复。容器化部署可有效解决模型打包与环境一致性问题,适用于AI推理等复杂场景[^3]。 6. **配置高可用与弹性伸缩** 为关键服务配置多副本、自动扩缩容策略和健康检查机制,确保服务在流量波动和节点故障时保持稳定运行。Kubernetes的HPA(Horizontal Pod Autoscaler)可基于CPU或自定义指标动态调整实例数量。 7. **安全与访问控制** 配置身份认证(IAM)、访问控制策略、加密通信(TLS/SSL)、防火墙规则等,保障应用和数据的安全性。使用VPC隔离关键业务系统,防止未授权访问。 8. **监控与日志管理** 部署监控系统(如Prometheus、Grafana、CloudWatch)实时跟踪服务状态,监控GPU利用率、推理延迟、错误率等核心指标。同时,集中管理日志数据,便于问题排查和性能优化。 9. **持续集成与持续交付(CI/CD)** 建立CI/CD流水线,自动化构建、测试和部署流程,提高交付效率。可使用Jenkins、GitLab CI、GitHub Actions等工具实现代码提交后的自动部署10. **灾备与备份恢复** 定期备份关键数据和配置信息,制定灾难恢复计划。可使用云服务商提供的快照、镜像、跨区域复制等功能,确保业务连续性。 ### 最佳实践 - **使用容器化部署**:容器化部署可以实现应用与环境的解耦,便于迁移和扩展。Kubernetes可提供高可用、自动扩缩容的服务编排能力[^3]。 - **采用基础设施即代码(IaC)**:通过Terraform、Ansible等工具实现基础设施的版本化管理,提升部署效率与一致性。 - **实现全链路可观测性**:集成监控、日志和追踪系统,实时掌握系统运行状态,及时发现并解决问题。 - **优化资源利用率**:根据应用负载动态调整资源,避免资源浪费,控制成本。对于深度学习推理任务,需结合模型优化与资源配置[^2]。 - **保障安全性**:启用多层安全机制,包括网络隔离、访问控制、加密传输和身份认证,防止数据泄露和非法访问。 ```yaml # 示例:Kubernetes部署文件片段 apiVersion: apps/v1 kind: Deployment metadata: name: app-deployment spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp-container image: myapp:latest ports: - containerPort: 80 ``` ```bash # 示例:使用Terraform创建ECS实例 resource "huaweicloud_ecs_instance" "example" { name = "ecs-instance" flavor_id = "c6.large.2" image_id = "your-image-id" vpc_id = "your-vpc-id" subnet_id = "your-subnet-id" security_group_id = "your-sg-id" } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值