Kubernetes
1、集群搭建(kubeadm)
1.1、环境准备
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
# 关闭swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
# 根据规划设置主机名
hostnamectl set-hostname <hostname>
# 在 Master 添加 hosts
cat >> /etc/hosts << EOF
192.168.0.181 k8smaster
192.168.0.182 k8snode1
192.168.0.183 k8snode2
EOF
# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效
# 时间同步
yum install ntpdate -y
ntpdate time.windows.com
# 东八区
cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
1.2、安装
###### 所有节点安装Docker/kubeadm/kubelet
### 安装docker
.....
## 添加阿里云YUM软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
### 安装kubeadm,kubelet和kubectl
yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
systemctl enable kubelet
### 部署 Kubernetes Master
kubeadm init \
--apiserver-advertise-address=192.168.0.181 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
## 使用kubectl工具:上图框中
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
## node节点执行
### 加入Kubernetes Node,上图下面的框中
kubeadm join xxx --token xxx \
--discovery-token-ca-cert-hash sha256:xxx
## 默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token
kubeadm token create --print-join-command
### 部署CNI网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
## 查看插件
kubectl get pods -n kube-system
### 测试 kubernetes 集群
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
## 访问: nodeIP:port (http://192.168.0.182:32474)
2、Kubectl
格式:kubectl [command] [type] [name] [falgs]
- command:指定要对资源执行的操作,例如create、get、describe 和delete
- type:指定资源类型,资源类型是大小写敏感的,开发者能够以单数、复数和缩略的形式
- name:指定资源的名称,名称也大小写敏感的。如果省略名称,则会显示所有的资源
- flags:指定可选的参数。例如,可用-s 或者–server 参数指定Kubernetes API server 的地址和端口。
kubectl get pod
kubectl get nodes
kubectl --help
生成 yaml 文件
# 使用 kubectl create 生成
kubectl create deployment web --image=nginx -o yaml --dry-run > my.yaml
# 使用 kubectl get 导出已有的
kubectl get deploy nginx -o=yaml > my2.yaml
3、Pod
apiVersion: v1
kind: Pod
metadata: //元数据
name: string
namespace: string
labels:
name: string
annotations:
-name: string
spec:
containers: //pod 中的容器列表,可以有多个容器
- name: string //容器的名称
image: string //容器中的镜像
imagesPullPolicy: [Always|Never|IfNotPresent]//获取镜像的策略,默认值为 Always,每次都尝试重新下载镜像
command: [string] //容器的启动命令列表(不配置的话使用镜像内部的命令) args:[string] //启动参数列表
workingDir: string //容器的工作目录volumeMounts: //挂载到到容器内部的存储卷设置
-name: string
mountPath: string //存储卷在容器内部Mount 的绝对路径readOnly: boolean //默认值为读写
ports: //容器需要暴露的端口号列表
-name: string
containerPort: int //容器要暴露的端口
hostPort: int //容器所在主机监听的端口(容器暴露端口映射到宿主机的端口,设置
hostPort 时同一台宿主机将不能再启动该容器的第2 份副本)
protocol: string //TCP 和UDP,默认值为TCP env: //容器运行前要设置的环境列表
-name: string value: string
resources:
limits: //资源限制,容器的最大可用资源数量cpu: Srting
memory: string
requeste: //资源限制,容器启动的初始可用资源数量cpu: string
memory: string
livenessProbe: //pod 内容器健康检查的设置exec:
command: [string] //exec 方式需要指定的命令或脚本httpGet: //通过httpget 检查健康
path: string port: number host: string scheme: Srtring httpHeaders:
- name: Stirng value: string
tcpSocket: //通过tcpSocket 检查健康
port: number initialDelaySeconds: 0//首次检查时间timeoutSeconds: 0 //检查超时时间
periodSeconds: 0 //检查间隔时间
successThreshold: 0
failureThreshold: 0 securityContext: //安全配置
privileged: falae
restartPolicy: [Always|Never|OnFailure]//重启策略,默认值为Always
nodeSelector: object //节点选择,表示将该Pod 调度到包含这些label 的Node 上,以
key:value 格式指定
imagePullSecrets:
-name: string
hostNetwork: false //是否使用主机网络模式,弃用Docker 网桥,默认否
volumes: //在该pod 上定义共享存储卷列表
-name: string emptyDir: {} hostPath:
path: string secret:
secretName: string item:
-key: string path: string
configMap: name: string items:
-key: string
path: string