Docker Kubernetes k8s 从入门到精通 阿里云实战命令
Posted AI架构师易筋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker Kubernetes k8s 从入门到精通 阿里云实战命令相关的知识,希望对你有一定的参考价值。
1. 部署单控制平面集群
文章目录
- **1. 部署单控制平面集群**
- **2. Nodes资源管理**
- **3. Label与Annotation**
- **4-5. Kubernetes API、Resources与Namespaces**
- **6. 工作负载之pods**
1. 1 基础环境准备
1.1.1 硬件准备
机器配置:2核CPU,4G内存,40G系统盘
系统:Ubuntu 16.04.6 LTS
机器数量:3台 (master01 node01 node02)
1.1.2 系统环境配置
修改配置静态hostname
hostnamectl set-hostname node01 --static
hostnamectl set-hostname node02 --static
hostnamectl set-hostname master01 --static
修改hosts表,集群所有节点保持文件内容一致
#Kubernetes
172.31.53.87 master01
172.31.53.88 node01
172.31.53.86 node02
配置服务器时间统一
关闭firewalld
ufw disable
关闭SELinux
ubuntu默认关闭SELinux
关闭swap
# 临时关闭
swapoff -a
# 永久关闭
注释掉/etc/fstab下的swap一行
开启参数自动补全,取消bash-completion注释
vim /etc/bash.bashrc
# enable bash completion in interactive shells
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
source /etc/bash.bashrc
1.1.3 Docker环境准备
更新apt包索引
apt-get update
安装软件包以允许apt通过HTTPS使用存储库
apt-get -y install \\
apt-transport-https \\
ca-certificates \\
curl \\
gnupg-agent \\
software-properties-common
添加Docker的官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
安装add-apt-repository工具
apt-get -y install software-properties-common
添加稳定的存储库
add-apt-repository \\
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \\
$(lsb_release -cs) \\
stable"
更新apt包索引
apt-get update
查看Docker版本
apt-cache madison docker-ce
安装docker-ce最新版本
apt-get -y install docker-ce docker-ce-cli containerd.io
docker info
解决问题:WARNING: No swap limit support(操作系统下docker不支持内存限制的警告),基于RPM的系统上不会发生此警告,该系统默认情况下启用这些功能。解决方法:vim /etc/default/grub 添加或编辑GRUB_CMDLINE_LINUX行以添加这两个键值对"cgroup_enable=memory swapaccount=1",例子:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1 net.ifnames=0 vga=792 console=tty0 console=ttyS0,115200n8 noibrs"
执行命令更新grub并重启机器
update-grub && reboot
docker 在 1.13 版本之后,将系统iptables 中 FORWARD 链的默认策略设置为 DROP,并为连接到 docker0 网桥的容器添加了ACCEPT规则,临时解决办法:
iptables -P FORWARD ACCEPT
永久解决办法:
vim /lib/systemd/system/docker.service
# 在[Service]下添加:
ExecStartPost=/sbin/iptables -P FORWARD ACCEPT
systemctl daemon-reload && systemctl restart docker.service
设置daemon.json
cat > /etc/docker/daemon.json <<EOF
"registry-mirrors": ["https://ezdhou8v.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts":
"max-size": "100m"
,
"storage-driver": "overlay2"
EOF
systemctl daemon-reload && systemctl restart docker.service
1.1.4 kubeadm环境准备
配置apt库,安装kubeadm、kubelet、kubectl
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
开启这些设置使通过网桥的数据包由主机系统上的iptables规则处理,默认关闭,设置为1则开启
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
1.2 创建单控制平面集群
1.2.1 初始化集群
命令详解
kubeadm config upload from-file:由配置文件上传到集群中生成ConfigMap;
kubeadm config upload from-flags:由配置参数生成ConfigMap;
kubeadm config view:查看当前集群中的配置值;
kubeadm config print init-defaults:输出kubeadm init默认参数文件的内容;
kubeadm config print join-defaults:输出kubeadm join默认参数文件的内容;
kubeadm config migrate:在新旧版本之间进行配置转换;
kubeadm config images list:列出所需的镜像列表;
kubeadm config images pull:拉取镜像到本地;
配置kubeadm的参数自动补全
# 查看completion帮助
kubeadm completion -h
# 配置自动补全
source <(kubeadm completion bash)
echo "source <(kubeadm completion bash)" >> ~/.bashrc
source ~/.bashrc
生成配置文件
kubeadm config print init-defaults > init-defaults.yaml
vim init-defaults.yaml修改:
clusterName: Cluster01
advertiseAddress: 172.24.51.176
imageRepository: registry.aliyuncs.com/google_containers
执行初始化操作
kubeadm init --config init-defaults.yaml
或者
kubeadm init --apiserver-advertise-address=172.24.205.51 --image-repository=registry.aliyuncs.com/google_containers
# 执行完初始化保存最后输出的结果到文件:管理用户配置、部署网络、添加节点相关信息.如果在初始化集群的时候出现报错,请执行 kubeadm reset 命令执行重置,解决提示的报错后在执行初始化操作。
1.2.2 kubectl配置文件
root用户
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /root/.bashrc
source /root/.bashrc
非root用户
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
1.2.3 kubectl参数自动补全
查看completion帮助
kubectl completion -h
kubectl自动补全添加到当前shell
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
1.2.4 Kubernetes网络
kubectl apply -f https://docs.projectcalico.org/v3.22/manifests/calico.yaml
# 指定网卡名称
kubectl -n kube-system edit daemonsets.apps calico-node
spec:
containers:
- env:
- name: IP_AUTODETECTION_METHOD # 添加该环境变量
value: interface=eth0 # 指定内网网卡名称,按事实情况修改
1.2.5 Nodes资源管理
1.2.5.1 添加Node节点
# 创建token (Master01节点执行)
kubeadm token create
# 永久token
kubeadm token create --ttl 0
# 查看token (Master01节点执行)
kubeadm token list
# 获取discovery-token-ca-cert-hash值(Master01节点执行)
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \\
openssl dgst -sha256 -hex | sed 's/^.* //'
# 添加work节点到kubernetes集群(work node节点执行)
kubeadm join <api-server-ip:port> --token <toke> --discovery-token-ca-cert-hash sha256:<discovery-token-ca-cert-hash>
kubeadm token create --print-join-command
# 自动生成以下命令,直接加入节点
kubeadm join 172.21.184.81:6443 --token jde7q3.bv4ehxnyxfe04m56 --discovery-token-ca-cert-hash sha256:cde3bc85a4fbc5bdb0e78a532d0fa0fbc301485f7d86806c06ea59f6f9610032
1.2.5.2 删除Node节点
# 删除节点
kubectl delete nodes <node_name>
# 删除/etc/kubernetes目录
rm -rf /etc/kubernetes/
# ssh到<node_name>执行清理残留操作
kubeadm reset
# 清理Iptables
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
或者
# 清理IPVS
ipvsadm -C
1.3 验证
# 检查组件状态是否正常
kubectl get componentstatuses
# 查看集群系统信息
kubectl cluster-info
# 查看核心组件是否运行正常(Running)
kubectl -n kube-system get pod
# 每次重启之后,删除非Up状态的容器
docker ps -a | grep -v Up | xargs docker rm -f
文章目录
- **1. 部署单控制平面集群**
- **2. Nodes资源管理**
- **3. Label与Annotation**
- **4-5. Kubernetes API、Resources与Namespaces**
- **6. 工作负载之pods**
2. Nodes资源管理
2.1 查看资源的简略信息
kubectl get nodes
# 解析:
NAME:node的名称
STATUS:node的状态
ROLES: node的角色
AGE:node的生命周期
VERSION:kubernetes版本
2.2 查看资源的扩展信息
kubectl get nodes -o wide
# 解析:
INTERNAL-IP::内部IP
EXTERNAL-IP:外部IP
OS-IMAGE:系统版本
KERNEL-VERSION;系统内核版本
CONTAINER-RUNTIME:container runtime的版本
2.3 查看资源的详细信息
kubectl describe nodes master01
# 解析:
capacity:描述节点上的总资源:CPU、内存和可以调度到节点上的最pod数量;
allocatable: 描述可分配的资源;
conditions:
MemoryPressure:
status: True 节点内存存在压力或者不足
status: False 节点内存正常无压力
DiskPressure:
status: True 磁盘容量存在压力或者容量低
status: False 磁盘容量正常无压力
PIDPressure:
status: True 进程上存在压力或者进程过多
status: False 进程正常无压力
Ready:
status: True 节点是健康正常
status: False 节点不健康
OutOfDisk:
status: True 如果节点上没有足够的空闲空间来添加新的pod
status: False 节点上有空闲的空间
NetworkUnavailable:
status: True 节点的网络配置不正确
status: False 节点的网络配置正确
2.4 查看资源的yaml文件格式
kubectl get nodes master01 -o yaml
2.5 查看资源的json文件格式
kubectl get nodes master01 -o json
文章目录
- **1. 部署单控制平面集群**
- **2. Nodes资源管理**
- **3. Label与Annotation**
- **4-5. Kubernetes API、Resources与Namespaces**
- **6. 工作负载之pods**
3. Label与Annotation
3.1 Label
查看资源的标签信息
kubectl get nodes --show-labels
或者
kubectl describe nodes node01
Label的添加与删除,Key必须存在且唯一,Value可以为空、且不唯一
# 添加Label
kubectl label nodes node01 node-role.kubernetes.io/work=
# 删除Label
kubectl label nodes node01 node-role.kubernetes.io/work-
查看node的角色
kubectl get nodes
3.2 Annotation
查看Annotation
kubectl describe resource_type resource_name
Annotation的添加与删除,#Key必须存在且唯一,Value可以为空、且不唯一
添加Annotation
kubectl annotate resource_type resource_name key=value
# 删除Annotation
kubectl annotate resource_type resource_name key-
文章目录
- **1. 部署单控制平面集群**
- **2. Nodes资源管理**
- **3. Label与Annotation**
- **4-5. Kubernetes API、Resources与Namespaces**
- **6. 工作负载之pods**
4-5. Kubernetes API、Resources与Namespaces
4. Kubernetes API与Resources
4.1 api-resources
查看Kubernetes的资源
kubectl api-resources
4.2 api-versions
查看Kubernetes api-version
kubectl api-versions
5. Namespaces
5.1 查看当前集群下的namespace
kubectl get namespaces
5.2 Namespaces的创建与删除
# 创建
kubectl create namespace test
# 删除
kubectl delete namespaces demo
# yaml创建
cat << EOF > my-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: demo
EOF
# 执行yaml文件创建namespaces
kubectl apply -f ./my-namespace.yaml
# 通过yaml文件删除namespaces
kubectl delete -f my-namespace.yaml
文章目录
- **1. 部署单控制平面集群**
- **2. Nodes资源管理**
- **3. Label与Annotation**
- **4-5. Kubernetes API、Resources与Namespaces**
- **6. 工作负载之pods**
6. 工作负载之pods
6.1 创建Pod
命令行创建Pod
kubectl run --image=nginx test
查看Pod
kubectl get pod
Yaml文件创建 – 指定Namespace
apiVersion: v1
kind: Namespace
metadata:
name: nginx-example
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod01
namespace: nginx-example
spec:
containers:
- name: pod-nginx
image: nginx
imagePullPolicy: IfNotPresent
Pods相关介绍
查看pod的状态
kubectl get pods
NAMESPACE:所属namespace
NAME: Pod名字
READY: Pod 是否为READY
STATUS: Pod状态
RESTARTS:容器的重启次数
AGE:生命周期
imagePullPolicy:
Always:每次都下载镜像(默认);
Never:只使用本地镜像,从不下载;
IfNotPresent:只有当本地没有的时候才下载镜像;
restartPolicy:
Always:除了Running状态都重启容器;
OnFailure:失败状态才重启容器;
Never:无论失败或者完成状态都不重启容器;
创建multiple-containers.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod01
spec:
containers:
- name: pod-nginx
image: nginx
- name: pod-tomcat
image: tomcat
6.2 设置pod的资源请求与限制
创建memory-request-limit.yaml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: memory-demo-ctr
image: polinux/stress
resources:
limits:
memory: "200Mi"
requests:
memory: "100Mi"
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]
创建cpu-request-limit.yaml
apiVersion: v1
kind: Pod
metadata:
name: cpu-demo
spec:
containers:
- name: cpu-demo-ctr
image: vish/stress
resources:
limits:
cpu: "1"
requests:
cpu: "0.5"
args:
- -cpus
- "2"
6.3 登陆容器操作
# pod封装一个容器
kubectl exec -it memory-demo bash
kubectl exec -it memory-demo -- ls /sbin
# pod封装多个容器
kubectl exec -it -c memory-demo-ctr-2 memory-demo bash
kubectl exec -it -c memory-demo-ctr-2 memory-demo -- ls /root
6.4 apply、edit与patch的使用
# apply的使用
kubectl apply -f
# edit的使用
kubectl edit <TYPE> <NAME>
# patch的使用
kubectl get <TYPE> <NAME> -o json
kubectl patch <TYPE> <NAME> -p '"metadata": "labels": "app": "damon"'
6.5 Init Containers
创建init-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp01
image: busybox:1.28
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo The myapp is running! && sleep 3600']
- name: myapp02
image: busybox:1.28
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init01
image: busybox:1.28
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo The app is complete! && sleep 10']
- name: init02
image: busybox:1.28
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo The init02 is complete! && sleep 10']
6.6 static Pods
kubeadm部署kubernetes集群的Static Pod的存放路径默认为:/etc/kubernetes/manifests/
修改Static Pod存放路径:
方法一:
修改/var/lib/kubelet/config.yaml
修改staticPodPath: /etc/kubernetes/manifests
方法二:
修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
在KUBELET_CONFIG_ARGS后添加参数:--pod-manifest-path=<绝对路径>
以上是关于Docker Kubernetes k8s 从入门到精通 阿里云实战命令的主要内容,如果未能解决你的问题,请参考以下文章