容器的兴起
容器是什么
容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用”装”起来的技术。
容器是特殊的进程
如何让进程变得特殊——隔离和限制
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 dockervim /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/
转载文章受原作者版权保护。转载请注明原作者出处!