还没学完《深入剖析Kubernetes》

容器的兴起

容器是什么

容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用”装”起来的技术。

容器是特殊的进程

如何让进程变得特殊——隔离和限制

Namespace (隔离)和 Cgroups(限制)

Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。

制作容器镜像

app.py

from flask import Flask
import socket
import os

app = Flask(__name__)

@app.route('/')
def hello():
    html = "Hello {name}!" \
           "Hostname: {hostname}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname())

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

requirements.txt

Flask

Dockerfile

使用官方提供的Python开发镜像作为基础镜像
FROM python:2.7-slim

将工作目录切换为/app
WORKDIR /app

将当前目录下的所有内容复制到/app下
ADD . /app

使用pip命令安装这个应用所需要的依赖
RUN pip install --trusted-host pypi.python.org -r requirements.txt

允许外界访问容器的80端口
EXPOSE 80

设置环境变量
ENV NAME World

设置容器进程为:python app.py,即:这个Python应用的启动命令
CMD ["python", "app.py"]

docker build -f ./Dockerfile -t helloworld .

docker run -p 4000:80 helloworld

Kubernetes 项目的本质,是为用户提供一个具有普遍意义的容器编排工具。

运行在大规模集群中的各种任务之间,实际上存在着各种各样的关系。这些关系的处理,才是作业编排和管理系统最困难的地方。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8oQHiy2q-1638000257379)(C:\Users\lofxve\AppData\Roaming\Typora\typora-user-images\image-20210729223306259.png)]

Master 组件

Master组件提供集群的管理控制中心。

kube-controller-manager运行管理控制器,它们是集群中处理常规任务的后台线程。逻辑上,每个控制器是一个单独的进程,但为了降低复杂性,它们都被编译成单个二进制文件,并在单个进程中运行。

这些控制器包括:

  • 节点(Node)控制器
  • 副本(Replication)控制器:负责维护系统中每个副本中的pod。
  • 端点(Endpoints)控制器:填充Endpoints对象(即连接Services&Pods)。
  • Service Account 和Token控制器:为新的 Namespace 创建默认帐户访问API Token。

云控制器管理器负责与底层云提供商的平台交互。云控制器管理器是Kubernetes版本1.6中引入的,目前还是Alpha的功能。

云控制器管理器仅运行云提供商特定的(controller loops)控制器循环。可以通过将 --cloud-provider flag设置为external启动kube-controller-manager ,来禁用控制器循环。

cloud-controller-manager 具体功能:

  • 节点(Node)控制器
  • 路由(Route)控制器
  • Service控制器
  • 卷(Volume)控制器

插件(addon)是实现集群pod和Services功能的 。Pod由Deployments,ReplicationController等进行管理。Namespace 插件对象是在kube-system Namespace中创建。

虽然不严格要求使用插件,但Kubernetes集群都应该具有集群 DNS。

群集 DNS是一个DNS服务器,能够为 Kubernetes services提供 DNS记录。

由Kubernetes启动的容器自动将这个DNS服务器包含在他们的DNS searches中。

节点(Node)组件

kubelet,使用CRI(Container Runtime Interface)的远程调用接口对容器进行控制。

docker用于运行容器。

rkt运行容器,作为docker工具的替代方案。

supervisord是一个轻量级的监控系统,用于保障kubelet和docker运行。

Secret (密钥管理功能),它其实是一个保存在 Etcd 里的键值对数据。Kubernetes 就会在你指定的 Pod(比如,Web 应用的 Pod)启动时,自动把 Secret 里的数据以 Volume 的方式挂载到容器里。

专业术语

编排,是按照用户的意愿和整个系统的规则,完全自动化地处理好容器之间的各种关系。

环境准备

https://blog.csdn.net/weixin_42211693/article/details/114385225

hostnamectl set-hostname master01

hostnamectl set-hostname node01

hostnamectl set-hostname node02

hostname

cat >> /etc/hosts << EOF
192.168.86.129 master01
192.168.86.130 node01
192.168.86.131 node02
EOF
source /etc/hosts

192.168.86.130 master01
192.168.86.129 node01
192.168.86.131 node02

ssh-keygen
ssh-copy-id root@node01
ssh-copy-id root@node02

systemctl stop firewalld && systemctl disable firewalld

systemctl status firewalld

sed -i ‘s/enforcing/disabled/’ /etc/selinux/config && setenforce 0

或者直接修改/etc/selinux/config文件

SELINUX=enforcing ===> SELINUX=disabled

sestatus

swapoff -a && sed -ri ‘s/. swap./#&/’ /etc/fstab

sysctl –system

free -mh

如果swap选项下全是0,这表示禁用了空间交换swap

yum install ntpdate -y && timedatectl set-timezone Asia/Shanghai && ntpdate time.windows.com

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables

Docker 安装

sudo yum update

yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo

yum -y install docker-ce

systemctl daemon-reload
systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl status docker
systemctl enable docker

vim /etc/docker/daemon.json

{ “exec-opts”:[“native.cgroupdriver=systemd”]}

sudo systemctl restart docker

kubectl 安装

下载最新版本的命令:

 curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl

要下载特定版本,请使用特定版本替换$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)命令的一部分。

例如,要在Linux上下载v1.7.0版本,请键入:

 curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.7.0/bin/linux/amd64/kubectl

使kubectl二进制可执行。

 chmod +x ./kubectl

将二进制文件移动到PATH中。

 sudo mv ./kubectl /usr/local/bin/kubectl

kubelet和kubeadm 安装

如果使用的是CentOS,请运行:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum install -y kubelet kubeadm

systemctl enable kubelet

systemctl start kubelet

下载所需的镜像(master)

kubeadm config images list

images=(kube-proxy:v1.20.4 kube-scheduler:v1.20.4 kube-controller-manager:v1.20.4 kube-apiserver:v1.20.4 etcd:3.4.13-0 coredns:1.7.0 pause:3.2)
for imageName in i m a g e s [ @ ] ; d o d o c k e r p u l l r e g i s t r y . a l i y u n c s . c o m / g o o g l e c o n t a i n e r s / {images[@]} ; do docker pull registry.aliyuncs.com/google_containers/i m a g e s [@];d o d o c k e r p u l l r e g i s t r y .a l i y u n c s .c o m /g o o g l e c ​o n t a i n e r s /imageName
docker tag registry.aliyuncs.com/google_containers/i m a g e N a m e k 8 s . g c r . i o / imageName k8s.gcr.io/i m a g e N a m e k 8 s .g c r .i o /imageName
docker rmi registry.aliyuncs.com/google_containers/$imageName
done

images=(kube-proxy:v1.20.4 kube-scheduler:v1.20.4 kube-controller-manager:v1.20.4 kube-apiserver:v1.20.4 etcd:3.4.13-0 coredns:1.7.0 pause:3.2)
for imageName in i m a g e s [ @ ] ; d o d o c k e r r m i k 8 s . g c r . i o / {images[@]}; do docker rmi k8s.gcr.io/i m a g e s [@];d o d o c k e r r m i k 8 s .g c r .i o /{imageName}
done

chmod ugo+x down.sh
chomd ugo+x delete.sh
./down.sh

docker images

kubeadm init

kubeadm join 192.168.86.130:6443 –token r774yc.q651j041vr004dc6 –discovery-token-ca-cert-hash sha256:accd26774dccb771068e0b89c7e30dd3a08e81b68990ae3464c4398802b1fa3f

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubectl get nodes

部署网络插件

kubectl apply -f “https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d ‘\n’)”

加入Node节点

只在node节点上运行,使用 root 权限登录 Centos7。

与master类似,down.sh脚本文件,内容如下:

images=(kube-proxy:v1.20.4 pause:3.2)
for imageName in i m a g e s [ @ ] ; d o d o c k e r p u l l r e g i s t r y . a l i y u n c s . c o m / g o o g l e c o n t a i n e r s / {images[@]} ; do docker pull registry.aliyuncs.com/google_containers/i m a g e s [@];d o d o c k e r p u l l r e g i s t r y .a l i y u n c s .c o m /g o o g l e c ​o n t a i n e r s /imageName
docker tag registry.aliyuncs.com/google_containers/i m a g e N a m e k 8 s . g c r . i o / imageName k8s.gcr.io/i m a g e N a m e k 8 s .g c r .i o /imageName
docker rmi registry.aliyuncs.com/google_containers/$imageName
done

!/bin/bash

images=(kube-proxy:v1.20.4 pause:3.2)
for imageName in i m a g e s [ @ ] ; d o d o c k e r r m i k 8 s . g c r . i o / {images[@]}; do docker rmi k8s.gcr.io/i m a g e s [@];d o d o c k e r r m i k 8 s .g c r .i o /{imageName}
done

chmod ugo+x down.sh
chomd ugo+x delete.sh
./down.sh

kubeadm join 10.0.15.192:6443 –token ptc2mv.z4xyu5z50jg86sze
–discovery-token-ca-cert-hash sha256:a22f5ac5211b03ac92b2d4570fb32f6bee0c81d5cadba0e6d24eeffcaf906ef8

获取token,在master节点上执行:

​ kubeadm token list

默认的token的有效期是24小时,可以自己生成永久有效期的token,具体如下:

创建token(24小时过期)

​ kubeadm token create

生成一条永久有效的token

​ kubeadm token create –ttl 0

获取sha256,在master节点上执行:

​ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed ‘s/^.* //’

sudo docker run -d --privileged --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher

从UI导航到Settings,然后编辑 system-default-registry,Value设置为 registry.cn-hangzhou.aliyuncs.com

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <

apiVersion: v1
kind: Pod
metadata:
  name: string
  namespace: string
  labels:
    - name: string
  annotations:
    - name: string
spec:
  containers:
  - name: string
    image: string
    imagePullPolicy: [Always | Never | IfNotPresent]
    command: [string]
    args: [string]
    workingDir: string
    volumeMounts:
    - name: string
      mountPath: string
      readOnly: boolean
    ports:
    - name: string
      containerPort: int
      hostPort: int
      protocol: string
    env:
    - name: string
      value: string
    resources:
      limits:
        cpu: string
        memory: string
      requests:
        cpu: string
        memory: string
    livenessProbe:
      exec:
        command: [string]
      httpGet:
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:
         port: number
       initialDelaySeconds: 0
       timeoutSeconds: 0
       periodSeconds: 0
       successThreshold: 0
       failureThreshold: 0
       securityContext:
         privileged:false
    restartPolicy: [Always | Never | OnFailure]
    nodeSelector: obeject
    imagePullSecrets:
    - name: string
    hostNetwork:false
    volumes:
    - name: string
      emptyDir: {}
      hostPath: string
        path: string
      secret:
        scretname: string
        items:
        - key: string
          path: string
      configMap:
        name: string
        items:
        - key: string

删除nodes

kubectl delete nodes localhost.localdomain

kubeadm reset

Original: https://blog.csdn.net/wei_zhen_dong/article/details/121578817
Author: 魏振东
Title: 还没学完《深入剖析Kubernetes》

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/747529/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球