云原生|kubernetes|apparmor的配置和使用

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 云原生|kubernetes|apparmor的配置和使用

前言:

APPARMor是一个Linux操作系统的内核安全模块,和selinux功能基本是一致的。

AppArmor(Application Armor)是Linux内核的一个安全模块,AppArmor允许系统管理员将每个程序与一个安全配置文件关联,从而限制程序的功能。简单的说,AppArmor是与SELinux类似的一个访问控制系统,通过它你可以指定程序可以读、写或运行哪些文件,是否可以打开网络端口等。作为对传统Unix的自主访问控制模块的补充,AppArmor提供了强制访问控制机制,它已经被整合到2.6版本的Linux内核中。

这里有一点需要特别强调,Ubuntu和openSUSE才有AppAromor,centos,Redhat这些操作系统才是使用SeLinux的。

因此,如果你对centos比较熟悉而对Ubuntu不太熟悉的情况下,可以简单的理解APPArmor为Ubuntu版的SeLinux

一,

APPArmor内核模块的停止和启用

AppArmor可以被禁用,其内核模块可以通过输入以下命令卸载:
sudo service apparmor stop
sudo update-rc.d -f apparmor remove
要重新启用AppArmor,输入:
sudo service apparmor start
sudo update-rc.d apparmor defaults

二,

APPArmor的两种工作模式

像 SELinux 一样,AppArmor 以两种模式运行。在 强制enforce 模式下,应用被赋予它们运行所需要的最小权限,但在 抱怨complain 模式下 AppArmor 允许一个应用执行受限的操作并将操作造成的“抱怨”记录到日志里(/var/log/kern.log/var/log/audit/audit.log,和其它放在 /var/log/apparmor 中的日志)。

这两种模式意思enforce是强制应用,而complain是仅仅记录受限情况,如其名一样,仅仅抱怨一通而已,当然,两种工作模式日志都会记录。

Enforcement(强制模式) :在这种模式下,配置文件里列出的限制条件都会得到执行,并且对于违反这些限制条件的程序会进行日志记录。使用aa-enforce <程序名>开启

Complain(投诉模式):在这种模式下,配置文件里的限制条件不会得到执行,Apparmor只是对程序的行为进行记录。一般用于调试。使用aa-complain <程序名>

Disable: 此时对应配置文件不加载,没有对程序行为进行限制。aa-disable <程序名>

查询APPArmor的状态:

apparmor_status 
apparmor module is loaded.
25 profiles are loaded.
23 profiles are in enforce mode.
   /sbin/dhclient
   /snap/snapd/17950/usr/lib/snapd/snap-confine
   /snap/snapd/17950/usr/lib/snapd/snap-confine//mount-namespace-capture-helper
   /usr/bin/docker
   /usr/bin/lxc-start
   /usr/bin/man
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/lib/NetworkManager/nm-dhcp-helper
   /usr/lib/connman/scripts/dhclient-script
   /usr/lib/snapd/snap-confine
   /usr/lib/snapd/snap-confine//mount-namespace-capture-helper
   /usr/local/bin/etcd
   /usr/sbin/tcpdump
   docker-default
   lxc-container-default
   lxc-container-default-cgns
   lxc-container-default-with-mounting
   lxc-container-default-with-nesting
   man_filter
   man_groff
   snap-update-ns.http
   snap.http.http
   snap.http.man
2 profiles are in complain mode.
   /bin/ping
   /usr/sbin/sshd
27 processes have profiles defined.
24 processes are in enforce mode.
   docker-default (29250) 
   docker-default (29270) 
   docker-default (29278) 
   docker-default (29411) 
   docker-default (29475) 
   docker-default (29554) 
   docker-default (29658) 
   docker-default (29748) 
   docker-default (29788) 
   docker-default (29833) 
   docker-default (29887) 
   docker-default (30114) 
   docker-default (30185) 
   docker-default (30186) 
   docker-default (30187) 
   docker-default (30350) 
   docker-default (30372) 
   docker-default (30569) 
   docker-default (30606) 
   docker-default (30607) 
   docker-default (30609) 
   docker-default (30998) 
   docker-default (31063) 
   docker-default (31064) 
1 processes are in complain mode.
   /usr/sbin/sshd (56029) 
2 processes are unconfined but have a profile defined.
   /usr/sbin/sshd (1409) 
   /usr/sbin/sshd (13170) 

以上表示25个程序是在enforce模式,两个程序是在Complain模式,1个进程在Complain模式下运行,2个sshd进程虽然有配置文件定义过,但没有激活,24个进程都是docker在enforce模式下。

三,

APPArmor的配置文件

我们安装了一个可执行程序,如果想用AppArmor进行访问控制,就需要新建一个配置文件到/etc/apparmor.d/目录下,这个目录下的每个配置文件都是跟可执行程序绑定的,不要随便修改配置文件名或程序路径。

例如,MySQL的APPArmor的配置文件:

# cat usr.sbin.mysqld
# vim:syntax=apparmor
# Last Modified: Tue Jun 19 17:37:30 2007
#include <tunables/global>
/usr/sbin/mysqld {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  #include <abstractions/user-tmp>
  #include <abstractions/mysql>
  #include <abstractions/winbind>
  capability dac_override,
  capability sys_resource,
  capability setgid,
  capability setuid,
  network tcp,
  /etc/hosts.allow r,
  /etc/hosts.deny r,
  /etc/mysql/*.pem r,
  /etc/mysql/conf.d/ r,
  /etc/mysql/conf.d/* r,
  /etc/mysql/*.cnf r,
  /usr/lib/mysql/plugin/ r,
  /usr/lib/mysql/plugin/*.so* mr,
  /usr/sbin/mysqld mr,
  /usr/share/mysql/** r,
  /var/log/mysql.log rw,
  /var/log/mysql.err rw,
  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,
  /var/log/mysql/ r,
  /var/log/mysql/* rw,
  /var/run/mysqld/mysqld.pid rw,
  /var/run/mysqld/mysqld.sock w,
  /run/mysqld/mysqld.pid rw,
  /run/mysqld/mysqld.sock w,
  /sys/devices/system/cpu/ r,
  # Site-specific additions and overrides. See local/README for details.
  #include <local/usr.sbin.mysqld>
}

在配置文件中,注释总是以# 号开头。#include 行加载文件。

以下是配置文件中使用的不同类型的规则。

  1. 路径条目:这包含有关允许应用程序访问哪些文件的信息。
  2. 能力条目:确定一个受限进程被允许使用的权限。
  3. 网络条目:确定连接类型。例如:tcp。对于数据包分析器网络可以是原始的或数据包等。

在花括号 {} 中,我们还有其他包含语句,还包括访问权限/模式 [read(r)/write (w)/execute (x) (k) 锁(需要 r 或 w,AppArmor 2.1 及更高版本)]各种文件和目录,包括正则表达式,用花括号 {} 对 include 语句进行通配有助于加载 Novell AppArmor 配置文件的组件。

以上配置文件限定了MySQL程序,例如对于 /var/log/mysql这个目录/usr/sbin/mysqld 这个程序只有读权限,但此目录下/usr/sbin/mysqld这个程序具有读写权限,/usr/lib/mysql 这个目录下,/usr/sbin/mysqld 这个程序有读写锁定权限,那么,我们可以判断出这个配置文件是针对yum安装的MySQL服务了。

四,

APPArmor的配置文件示例:

cat >/etc/apparmor.d/k8s-apparmor-example-deny-write<<EOF
profile k8s-apparmor-example-deny-write flags=(attach_disconnected) {
  file,
  # Deny all file writes.
  deny /** w,
}
EOF

在此示例中,配置文件授予应用程序所有类型的访问权限,但写入整个文件系统除外。它包含两个规则:

  • file: 允许对整个文件系统进行各种访问
  • deny /** w: 拒绝在根目录下写入任何文件/。该表达式/**转换为根目录下的任何文件,以及其子目录下的文件。

五,

将以上配置文件加载进APPArmor模块内:

cat /etc/apparmor.d/k8s-apparmor-example-deny-write |sudo apparmor_parser -a

查看APPArmor的状态:

可以看到新增的配置文件,并且该配置是enforce工作模式

root@k8s-master:~# apparmor_status 
apparmor module is loaded.
25 profiles are loaded.
23 profiles are in enforce mode.
   /sbin/dhclient
   /snap/snapd/17950/usr/lib/snapd/snap-confine
   /snap/snapd/17950/usr/lib/snapd/snap-confine//mount-namespace-capture-helper
   /usr/bin/lxc-start
   /usr/bin/man
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/lib/NetworkManager/nm-dhcp-helper
   /usr/lib/connman/scripts/dhclient-script
   /usr/lib/snapd/snap-confine
   /usr/lib/snapd/snap-confine//mount-namespace-capture-helper
   /usr/local/bin/etcd
   /usr/sbin/tcpdump
   docker-default
   k8s-apparmor-example-deny-write
。。。。。。。。。。。。。。。略略略。。。。。。。。。。。。。。。。。。。。。。

六,

kubernetes的pod引用以上的APPArmor配置文件:

主要是注解container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-apparmor-example-deny-write

注意,这个localhost前面是有空格的,hello是下面的pod部署文件里的container下的名字,k8s-apparmor-example-deny-write是上面新建的那个apparmor配置文件

apiVersion: v1
kind: Pod
metadata:
  name: hello-apparmor
  annotations:
    # Tell Kubernetes to apply the AppArmor profile "k8s-apparmor-example-deny-write".
    container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-apparmor-example-deny-write
spec:
  containers:
  - name: hello
    image: busybox
    command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]

运行这个pod,但发现此pod状态是blocked

root@k8s-master:~# kubectl get po
NAME                                      READY   STATUS    RESTARTS         AGE
hello-apparmor                            0/1     Blocked   0                4m48s

查询具体原因为:

kubectl describe pod hello-apparmor
Message:      Cannot enforce AppArmor: profile "k8s-apparmor-example-deny-write" is not loaded
root@k8s-master:~# kubectl describe pod hello-apparmor 
Name:         hello-apparmor
Namespace:    default
Priority:     0
Node:         k8s-node1/192.168.123.151
Start Time:   Thu, 12 Jan 2023 21:34:57 +0800
Labels:       <none>
Annotations:  container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-apparmor-example-deny-write
Status:       Pending
Reason:       AppArmor
Message:      Cannot enforce AppArmor: profile "k8s-apparmor-example-deny-write" is not loaded
IP:           
IPs:          <none>
Containers:
  hello:
    Container ID:  
    Image:         busybox
    Image ID:      
    Port:          <none>
    Host Port:     <none>
    Command:
      sh
      -c
      echo 'Hello AppArmor!' && sleep 1h
    State:          Waiting
      Reason:       Blocked
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-cjw7z (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             False 
  ContainersReady   False 
  PodScheduled      True 
Volumes:
  kube-api-access-cjw7z:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
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:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  5m8s  default-scheduler  Successfully assigned default/hello-apparmor to k8s-node1

OK,这个明明在master节点使用aaparmor_status 查看到了的啊,wait,这个pod是运行在node1节点的:

root@k8s-master:/etc/apparmor.d# kubectl get no -owide
NAME         STATUS   ROLES                  AGE    VERSION    INTERNAL-IP       EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
k8s-master   Ready    control-plane,master   400d   v1.22.10   192.168.123.150   <none>        Ubuntu 18.04.5 LTS   4.15.0-200-generic   docker://20.10.0
k8s-node1    Ready    <none>                 30d    v1.22.2    192.168.123.151   <none>        Ubuntu 18.04.5 LTS   4.15.0-200-generic   docker://20.10.0
k8s-node2    Ready    <none>                 30d    v1.22.2    192.168.123.152   <none>        Ubuntu 18.04.5 LTS   4.15.0-200-generic   docker://20.10.0

原因总算清楚了,node1上并没有这个k8s-apparmor-example-deny-write配置文件,OK,拷贝此文件到node1节点并加载到内核中:

root@k8s-master:/etc/apparmor.d# scp k8s-apparmor-example-deny-write k8s-node1:/etc/apparmor.d/
The authenticity of host 'k8s-node1 (192.168.123.151)' can't be established.
ECDSA key fingerprint is SHA256:nG/f/jJzY0mQunN4HWMIaHLaElyZZjOHCG2XCYFA5YI.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'k8s-node1' (ECDSA) to the list of known hosts.
root@k8s-node1's password: 
k8s-apparmor-example-deny-write                                                                                                                      100%  120   106.0KB/s   00:00    

在node1节点上加载k8s-apparmor-example-deny-write这个配置文件:

root@k8s-node1:~# apparmor_parser -a /etc/apparmor.d/k8s-apparmor-example-deny-write

重新app 以上pod,查看状态,可以发现正常的running了:

root@k8s-master:~# kubectl get po hello-apparmor 
NAME             READY   STATUS    RESTARTS   AGE
hello-apparmor   1/1     Running   0          29m

七,

测试APPArmor配置文件效果:

进入容器后,执行创建文件touch命令无法写入,echo重定向也没有权限

root@k8s-master:~# kubectl exec -it hello-apparmor -- /bin/sh
/ # touch aaa
touch: aaa: Permission denied
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # cat etc/
group        hostname     hosts        localtime    mtab         network/     passwd       resolv.conf  shadow
/ # cat etc/hostname 
hello-apparmor
/ # echo "fuck apparmor" >test
/bin/sh: can't create test: Permission denied

OK,此前我们查询到了这个APPArmor配置文件是运行在enforce模式下的,现在登陆node1将它修改成Complain模式:

注意,如果没有aa-complain和aa-enforce命令,那么是需要安装apparmor-utils这个工具包的:

安装apparmor工具包

root@k8s-node1:~# apt-get install apparmor-utils 
Reading package lists... Done
Building dependency tree       
。。。。。。。。。。。略略略。。。。。。。。。

使用aa-complain命令直接指定apparmor的配置文件,切换到complain模式

root@k8s-node1:~# aa-complain /etc/apparmor.d/k8s-apparmor-example-deny-write 
Setting /etc/apparmor.d/k8s-apparmor-example-deny-write to complain mode.

查看apparmor的状态:

可以看到k8s-apparmor-example-deny-write这个配置文件正确的加载了

root@k8s-node1:~# apparmor_status |grep k8s
   k8s-apparmor-example-deny-write
   k8s-apparmor-example-deny-write (117874) 
root@k8s-node1:~# ps -ef |grep 117874
root     117874 117847  0 22:44 ?        00:00:00 sleep 1h
root     121613  64994  0 22:48 pts/0    00:00:00 grep --color=auto 117874

八,

自动生成apparmor配置文件

root@k8s-master:~# aa-genprof /usr/bin/passwd 
Writing updated profile for /usr/bin/passwd.
Setting /usr/bin/passwd to complain mode.
Before you begin, you may wish to check if a
profile already exists for the application you
wish to confine. See the following wiki page for
more information:
http://wiki.apparmor.net/index.php/Profiles
Profiling: /usr/bin/passwd
Please start the application to be profiled in
another window and exercise its functionality now.
Once completed, select the "Scan" option below in 
order to scan the system logs for AppArmor events. 
For each AppArmor event, you will be given the 
opportunity to choose whether the access should be 
allowed or denied.
[(S)can system log for AppArmor events] / (F)inish
Profiling: /usr/bin/passwd
Please start the application to be profiled in
another window and exercise its functionality now.
Once completed, select the "Scan" option below in 
order to scan the system logs for AppArmor events. 
For each AppArmor event, you will be given the 
opportunity to choose whether the access should be 
allowed or denied.
[(S)can system log for AppArmor events] / (F)inish

多说一句,这个自动生成的配置文件还是在/etc/apparmor.d/目录下,但它是通过读取系统日志文件/var/log/syslog来进行的,因此,上面的提示说要新开一个窗口,运行一下passwd程序,生成相关的日志文件:

/var/log/syslog文件的部分日志

Jan 12 22:51:22 k8s-master kernel: [31693.170585] audit: type=1400 audit(1673535082.352:290): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/sbin/pivot_root" pid=128518 comm="apparmor_parser"
Jan 12 22:51:22 k8s-master root: GenProf: 7da38636a415bfc154b9d7e3303b6226
Jan 12 22:51:29 k8s-master kernel: [31700.804407] audit: type=1400 audit(1673535089.988:291): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/sbin/pivot_root" pid=128629 comm="apparmor_parser"
Jan 12 22:51:46 k8s-master kernel: [31717.547306] audit: type=1400 audit(1673535106.732:292): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/bin/passwd" pid=128922 comm="apparmor_parser"
Jan 12 22:51:46 k8s-master root: GenProf: 4f5800b7e323735332abb0252b0afcf3
Jan 12 22:51:53 k8s-master kernel: [31724.097027] audit: type=1400 audit(1673535113.280:293): apparmor="ALLOWED" operation="open" profile="/usr/bin/passwd" name="/proc/129027/loginuid" pid=129027 comm="passwd" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
Jan 12 22:51:53 k8s-master kernel: [31724.097252] audit: type=1400 audit(1673535113.280:294): apparmor="ALLOWED" operation="open" profile="/usr/bin/passwd" name="/etc/nsswitch.conf" pid=129027 comm="passwd" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
Jan 12 22:51:53 k8s-master kernel: [31724.097915] audit: type=1400 audit(1673535113.284:295): apparmor="ALLOWED" operation="open" profile="/usr/bin/passwd" name="/etc/passwd" pid=1290

九,

移除apparmor的配置文件:

apparmor_parser -R /etc/apparmor.d/k8s-apparmor-example-deny-write

再次查询,看不到k8s-apparmor-example-deny-write了:

root@k8s-master:/etc/apparmor# apparmor_status |grep k8s

十,

查询内核是否开启了apparmor:

root@k8s-master:/etc/apparmor# cat /sys/module/apparmor/parameters/enabled 
Y
root@k8s-master:/etc/apparmor# cat /sys/module/apparmor/parameters/debug 
N

查看加载了哪些profile:

root@k8s-master:/etc/apparmor# cat /sys/kernel/security/apparmor/profiles
/usr/bin/passwd (enforce)
/sbin/pivot_root (enforce)

 

kubernetes查询是否支持apparmor:

kubernetes的版本必须是大于1.14的哦

root@k8s-master:/etc/apparmor#  kubectl get nodes -o=jsonpath=$'{range .items[*]}{@.metadata.name}: {.status.conditions[?(@.reason=="KubeletReady")].message}\n{end}'
k8s-master: kubelet is posting ready status. AppArmor enabled
k8s-node1: kubelet is posting ready status. AppArmor enabled
k8s-node2: kubelet is posting ready status. AppArmor enabled
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
7月前
|
人工智能 缓存 Kubernetes
ACK GIE配置建议
Gateway with Inference Extension是基于Kubernetes社区Gateway API及其扩展规范实现的增强型组件,支持四层/七层路由服务,并面向生成式AI推理场景提供负载均衡优化、服务管理简化等能力,适用于AI推理服务的高可用部署与性能优化。在不同的场景使用ACK Gateway with Inference Extension时,可能需要根据业务需求和高可用需要对网关和推理扩展进行不同的配置调整。本文主要介绍在实际业务场景中针对ACK GIE的配置建议,以获得更好的使用效果。
431 23
|
11月前
|
Prometheus Kubernetes 监控
Kubernetes监控:Prometheus与AlertManager结合,配置邮件告警。
完成这些步骤之后,您就拥有了一个可以用邮件通知你的Kubernetes监控解决方案了。当然,所有的这些配置都需要相互照应,还要对你的Kubernetes集群状况有深入的了解。希望这份指南能帮助你创建出适合自己场景的监控系统,让你在首次发现问题时就能做出响应。
620 22
|
12月前
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
ACK One注册集群已正式支持ACS(容器计算服务)算力,为企业的容器化工作负载提供更多选择和更强大的计算能力。
|
12月前
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
351 10
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
551 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
4月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
386 1

热门文章

最新文章

推荐镜像

更多