首页 k8s搭建轻量linux虚机
文章
取消

k8s搭建轻量linux虚机

一. alpine是什么?

alpine是基于Musl-libc和busybox构建起来的linux安全轻量发行版,这怎么理解呢?我们知道linux的内核是基于C语言进行开发,C语言提供了一系列的标准库,linux内核就是基于这些标准C库进行编译构建出来的。Musl-libc就是C语言标准的一个实现,主打轻量。其他的C语言的标准实现还有

  1. glibc(GUN C),优点:功能齐全兼容性好,移植性好
  2. eglibc,glibc的变种,优点就是可以通过配置裁剪一些不必要的模块
  3. uclibc,小型c语言库,用于嵌入式

alpine = 基于Musl-libc编译的linux内核 + busybox命令工具集。

java程序可以使用alpine吗?

java程序依赖的是jdk,jdk依赖的是linux内核,linux内核已经屏蔽了底层细节, 所以直接装标准的jdk就可以了。

期待结果:在k8s上面跑一个linux操作系统,像使用本地shell一样操作这个系统。

环境版本
操作系统macOS Catalina 10.15.7
docker-desktop4.9.1
docker engine20.10.16
kubernetesv1.24.0

下面我们就来在k8s上面制作这么一个本地的小linux虚拟机,用于日常的linux调试学习使用。

二. 制作带ssh的alpine镜像

  1. 编写dockerfile文件 vi alpine-dockerfile

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    FROM alpine:3.16.0
    RUN echo "root:root" | chpasswd \
        && echo "alias ll='ls -la'" >> /etc/profile.d/my.sh \
        && apk -U --no-cache add openssh-server \
        && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" \
        && ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" \
        && ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" \
        && echo -e "PermitRootLogin yes\nPort 22\nListenAddress 0.0.0.0\nHostKey /etc/ssh/ssh_host_rsa_key\nHostKey /etc/ssh/ssh_host_ecdsa_key\nHostKey /etc/ssh/ssh_host_ed25519_key\nPasswordAuthentication yes" >> /etc/ssh/sshd_config
    CMD ["/usr/sbin/sshd", "-D"]
    
  2. 构建docker镜像 docker build -f alpine-dockerfile -t alpine-ssh:3.16.0 .

三. 编排启动服务

  1. 编写alpine的k8s编排文件vi alpine.yaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: alpine
      labels:
        app: alpine
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: alpine
      template:
        metadata:
          labels:
            app: alpine
        spec:
          containers:
          - image: alpine-ssh:3.16.0
            name: alpine
            command: ["/usr/sbin/sshd", "-D"]
            imagePullPolicy: IfNotPresent
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: alpine-cs
      labels:
        app: alpine
    spec:
      type: NodePort
      ports:
      - port: 22
        name: client
        nodePort: 30022
      selector:
        app: alpine
    
  2. 启动编排文件kubectl apply -f alpine.yaml

四. 本地远程连接

  1. 添加centos命令别名

    1
    
    echo "alias alpine='ssh -p 30022 root@localhost'" >> ~/.bash_profile
    
  2. 执行centos命令,输入密码 alpine

五. 过程遇到的问题

  1. 刚开始想启动一个centos7容器,通过systemctl start sshd 报错

    Failed to get D-Bus connection: Operation not permitted

    原因:需要特权容器才能使用systemctl命令,特权容器是什么?

    docker里面的每一个容器其实都不是一个完整的操作系统,只是一个轻量级的运行在宿主机上的一个进程,通过cgroup进行隔离这些进程的资源使用,但实际上这些容器都是共用同一个宿主机的操作系统的,cgroup隔离的资源是独占的,没隔离的资源就是共享的。其中systemd的服务是没有通过cgroup进行隔离的,想要获取这部分的资源就需要设置这个容器为特权容器, 特权容器就是可以访问非共享资源的容器。

    另一个从设计层面进行考虑, docker是设计成轻量级进程容器,初衷就是每个容器里面一个前台进程, 如果需要使用systemd启动一个守护的后台进程的话就会多了一个守护进程,当docker接受的容器的销毁停止命令的时候只会给这个容器的前台进程发送停止的指令,后台进程就会变成幽灵守护进程。

  2. docker build -t alpine-ssh:3.16.0 . 失败

    failed to solve with frontend dockerfile.v0: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount3724365558/Dockerfile: no such file or directory

    环境:docker-desktop 4.9.1

    错误原因:使用docker build的时候默认找的配置文件名为Dockerfile, 如果配置文件改了别的名字要用-f进行指定。

    正确命令:docker build -f alpine-dockerfile -t alpine-ssh:3.16.0 .

  3. 使用ssh连接的时候出现permission deny的时候可能的原因。

    1. 密码错误,我们直接使用echo "root:root" | chpasswd进行修改的密码,所以不可能错误
    2. 使用root用户登录ssh的时候要在sshd_config中配置 PasswordAuthentication yes, 才能允许root用户远程登录
本文由作者按照 CC BY 4.0 进行授权

正则与常用命令操作

乱码那些事-字符编码扫盲