2024-08-12

在Ubuntu上部署Kubernetes(K8S)集群的步骤如下:

  1. 准备工作:

    • 确保所有节点的时间同步。
    • 关闭防火墙和SELinux。
    • 禁用Swap分区。
    • 安装Docker。
    • 添加用户到docker组。
  2. 安装kubeadm, kubelet和kubectl:

    
    
    
    sudo apt-get update && sudo apt-get install -y apt-transport-https curl
    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
    sudo apt-get update
    sudo apt-get install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl
  3. 初始化master节点:

    
    
    
    sudo kubeadm init --pod-network-cidr=10.244.0.0/16
  4. 为了能够在非root用户下运行kubectl,配置kubectl的访问:

    
    
    
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  5. 安装Pod网络插件(如Calico):

    
    
    
    kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
  6. 加入工作节点到集群:

    • 在master节点上执行kubeadm token create --print-join-command来获取加入命令。
    • 在工作节点上运行上一步得到的加入命令。

以上步骤在每个节点上执行,确保所有节点时间同步,防火墙关闭,SELinux关闭,Swap分区禁用,Docker安装完毕。

请注意,这是一个基础的Kubernetes集群部署,实际部署时可能需要考虑更多因素,如高可用性、安全性、资源配额等。

2024-08-12

在Kubernetes中,Deployment是一种管理Pod的方式,它能够提供滚动更新的能力,即不停机更新应用程序的能力。

以下是一个简单的Deployment定义示例,它使用了新版本的应用程序镜像,并设置了滚动更新策略:




apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:v2
        ports:
        - containerPort: 80

在这个配置中:

  • replicas: 3 表示Deployment会确保有3个Pod实例。
  • strategy 部分定义了滚动更新的策略。
  • rollingUpdate 中的 maxUnavailable: 1 表示在更新过程中最多有1个Pod可用,maxSurge: 1 表示在更新过程中最多可以超过原有的Pod数量1个。
  • selector 定义了Deployment如何选择Pod。
  • template 定义了Pod的模板,包括标签和容器的镜像版本。

当你更新Deployment以使用新的镜像版本时(例如,将 my-app:v2 更新为 my-app:v3),Kubernetes会逐渐用新版本替换现有的Pod,同时确保至少有 (replicas - maxUnavailable) 或更多的Pod处于运行状态。

如果需要回退到旧版本,你可以通过 kubectl 命令将Deployment的镜像更改回 my-app:v2,Kubernetes将再次开始滚动更新,将Pod逐渐更新回 v2 版本。

这个过程提供了以下能力:

  • 滚动更新:不需要停机即可更新应用程序。
  • 版本控制:可以轻松回退到旧版本。

要执行更新或回退,你可以使用以下命令:




# 更新Deployment
kubectl set image deployment/my-app my-app=my-app:v3
 
# 回退到v2版本
kubectl set image deployment/my-app my-app=my-app:v2

这些命令会触发Deployment的滚动更新,Kubernetes会处理剩下的更新工作。

2024-08-12

在Kubernetes上部署MySQL可以通过以下步骤进行:

  1. 创建一个Dockerfile来构建包含MySQL的Docker镜像。
  2. 创建一个Kubernetes ConfigMap来保存MySQL配置文件。
  3. 创建一个Kubernetes Deployment来部署MySQL Pod。
  4. 创建一个Kubernetes Service来暴露MySQL服务。

以下是一个简单的例子:

Dockerfile:




FROM mysql:5.7
COPY my.cnf /etc/mysql/conf.d/

my.cnf (你需要根据实际情况配置):




[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
# Only allow connections from localhost
bind-address    = 0.0.0.0

ConfigMap (mysql-config.yaml):




apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
data:
  my.cnf: |
    [mysqld]
    pid-file = /var/run/mysqld/mysqld.pid
    socket = /var/run/mysqld/mysqld.sock
    datadir = /var/lib/mysql
    # Only allow connections from localhost
    bind-address = 0.0.0.0

Deployment (mysql-deployment.yaml):




apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "yourpassword"
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-config-volume
          mountPath: /etc/mysql/conf.d
        - name: mysql-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-config-volume
        configMap:
          name: mysql-config
          items:
          - key: my.cnf
            path: my.cnf
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

Service (mysql-service.yaml):




apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  clusterIP: None

PersistentVolumeClaim (mysql-pv-claim.yaml):




apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

在Kubernetes集群中部署时,你需要先创建PersistentVolumeClaim来申请存储,然后依次应用ConfigMap、Deployment和Service资源。这样就可以在Kubernetes上部署一个可用的MySQL服务了。记得替换Dockerfile中的配置和Deployment中的环境变量(如MySQL root密码)以及PersistentVolumeClaim中的存储大小。

2024-08-12

以下是一个简化的Kubernetes部署MySQL 5.7的示例配置:

  1. 创建一个名为mysql-deployment.yaml的文件,内容如下:



apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 250Mi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.7
        name: mysql
        env:
          - name: MYSQL_ROOT_PASSWORD
            value: my-secret-pw
          - name: MYSQL_DATABASE
            value: my-database
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim
  1. 在命令行中运行以下命令来应用配置:



kubectl apply -f mysql-deployment.yaml

这个配置包括了一个无头服务(mysql),用于在集群内部暴露MySQL服务,一个持久卷声明(mysql-pv-claim),用于存储数据,以及一个部署(mysql),它使用了MySQL 5.7镜像,并设置了环境变量来配置root密码和初始数据库。

请根据实际情况调整存储大小、密码和数据库名。如果你的Kubernetes集群配置了持久卷(PV)和存储类(StorageClass),你可能需要调整PersistentVolumeClaim来请求正确的存储资源。

2024-08-11



# 设置Jenkins的用户和用户组
JENKINS_USER="jenkins"
JENKINS_GROUP="jenkins"
 
# 创建Jenkins的主目录
mkdir /home/$JENKINS_USER
chown $JENKINS_USER:$JENKINS_GROUP /home/$JENKINS_USER
 
# 创建Jenkins Dockerfile
cat <<EOF > /home/$JENKINS_USER/Dockerfile
FROM jenkins/jenkins:lts
USER root
ARG dockerGid=0
RUN echo "docker:x:\$dockerGid:docker" >> /etc/group
USER \$JENKINS_USER
EOF
 
# 构建Jenkins Docker镜像
docker build -t my-jenkins:latest /home/$JENKINS_USER
 
# 清理Dockerfile
rm /home/$JENKINS_USER/Dockerfile

这段代码展示了如何创建一个用于Jenkins的Dockerfile,并构建一个自定义的Jenkins Docker镜像。这是在Kubernetes环境中部署分布式Jenkins的一个基本步骤。

2024-08-11



apiVersion: v1
kind: ConfigMap
metadata:
  name: game-config-demo
data:
  # 配置文件的键值对
  game.properties: |
    enemy.types=aliens,monsters
    player.lives=3
    player.level=1
    ui.theme=dark

这是一个简单的ConfigMap定义示例,其中包含了一些游戏配置信息。在Kubernetes中,ConfigMap可以用来保存不包含敏感信息的配置信息,并且可以在Pod运行时将这些信息挂载为文件或者环境变量。这个ConfigMap可以被Pod引用,并且在配置发生变化时,Pod中的应用也可以感知这些变化。

2024-08-11



# 安装calico网络插件
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
 
# 查看calico相关的pod状态
kubectl get pods -n kube-system -l k8s-app=calico-node
 
# 查看calico的配置详情
kubectl describe pods -n kube-system -l k8s-app=calico-node

这段代码展示了如何在Kubernetes集群上安装Calico网络插件,并查看相关的Pods状态和配置信息。这是学习和维护Kubernetes网络的一个基本步骤。

2024-08-10

在Kubernetes (K8s) 集群中部署一个Mysql一主两从的集群,可以使用StatefulSet来保证每个Mysql实例的状态,并使用ConfigMap来管理Mysql配置文件。以下是一个简化版的部署示例:

  1. 创建ConfigMap:



apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
data:
  my.cnf: |
    [mysqld]
    log-bin
    server-id=1
  1. 创建StatefulSet:



apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "mysql"
  replicas: 3
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: my-secret-pw
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
        - name: mysql-config
          mountPath: /etc/mysql/conf.d
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi

在这个示例中,我们定义了一个包含三个副本的StatefulSet,每个Mysql实例都使用持久化存储和配置。server-id将被设置为从1开始的序列号,每个实例的log-bin都会基于这个序列号配置。

要创建这些资源,只需将它们保存为YAML文件,然后使用kubectl命令应用到你的K8s集群即可。




kubectl apply -f mysql-config.yaml
kubectl apply -f mysql-statefulset.yaml

在部署之后,你需要配置Mysql从实例以连接到主实例并启动复制过程。这通常涉及到在从实例上执行CHANGE MASTER TO命令,并启动复制进程。这些步骤可以通过脚本或手动进行。

注意:这个示例是一个简化的部署,并且没有包括任何安全配置,如TLS/SSL加密或网络策略。在生产环境中,你需要添加额外的安全措施。

2024-08-10

在Docker的早期版本中,确实有一个叫做 "Docker in Docker" (dind) 的特性,允许在Docker容器中运行Docker守护进程。但这种做法已经不再推荐,因为它引入了复杂性和潜在的资源泄露问题。

从Docker 19.03版本开始,Docker提供了更好的方式来运行Docker-in-Docker:使用用户命名空间。这种新的方法通过将容器加入到宿主机的Docker组来允许容器内的Docker守护进程访问Docker套接字。

在Dockerfile中启用Docker-in-Docker的示例:




FROM docker:dind
USER root
RUN echo 'DOCKER_OPTS="--userns-remap=default"' >> /etc/default/docker

在Kubernetes中,你可以通过DaemonSet来运行Docker守护进程,并将其配置为使用--userns-remap参数。

在Kubernetes环境中,建议使用容器运行时接口(CRI)插件,如containerd或CRI-O,这些通常会有内置的机制来安全地进行这种嵌套。

在Go语言环境中,你可以使用官方的docker库来与Docker守护进程交互,但是不推荐在Go程序中直接运行Docker守护进程,因为这样做会增加维护和测试的复杂性。更好的做法是通过Docker API与Docker守护进程通信。

2024-08-10



# 引入Traefik的Helm chart
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: redirect-https
  namespace: kube-system
spec:
  redirectScheme:
    scheme: https
    permanent: true
 
---

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: https-only
  namespace: kube-system
spec:
  headers:
    sslRedirect: true
    browserXssFilter: true
    contentTypeNosniff: true
    forceSTSHeader: true
    stsSeconds: 31536000
    frameDeny: true
    customResponseHeaders:
      Access-Control-Allow-Origin: "*"
 
---

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: rate-limit
  namespace: kube-system
spec:
  rateLimit:
    rateSet:
      - period: 10s
        average: 5
        burst: 10
 
---

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: compression
  namespace: kube-system
spec:
  compress:
    responseHeaderName: Content-Encoding
    algorithms:
      - gzip
 
---

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: hsts-header
  namespace: kube-system
spec:
  headers:
    stsSeconds: 31536000
    loadBalancerInfo:
      responseHeader: X-Load-Balancer-ID
      responseHeaderValue: "my-load-balancer-id"

这个配置文件定义了几个Traefik的Middleware实体,它们分别设置了HTTPS重定向、安全头部设置、速率限制、压缩以及HSTS头部的相关参数。这些Middleware可以被应用到IngressRoute规则中去,以增强应用的安全性和性能。