k8s集群本地安装体验
更多官方文档
https://kubernetes.io/zh/docs/tasks/administer-cluster/network-policy-provider/calico-network-policy/
https://www.kubernetes.org.cn/cronjob
使用kubeadm 部署k8s集群
ps: k8s 不能直接管理容器 最小单位为pod 需要借助docker
前期准备
1. 三台虚拟机 分别设置主机名 hostnamectl set-hostname master1 、worker1 、worker2
2. 网络修改 vi /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO none/static
IPADDR="192.168.199.128" 当前虚拟机ip
PREFIX="24"
GATWAY="192.168.199.2" 一般为当前网段的.2
DNS1="119.29.29.29"
重启网卡 systemctl restart network
3. 安全配置关闭firewalld selinux
systemctl stop firewalld
systemctl disable firewalld
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
4. 时间同步
yum -y install ntpdate
ntpdate time1.aliyun.com
6. kubeadm安装需要关闭swap 分区
vim /etc/fstab free -m 查看 如果有swap分区 需要关闭
7. 添加网桥过滤
cat /etc/sysctl.d/k8s.cof
net.bridge.bridge-nf-call-ip6tables =1
net.bridge.bridge-nf-call-iptables =1
net.ipv4.ip_forward = 1
vm.swappiness = 0
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
8. 安装 ipvs
yum -y install ipset ipvsadm
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
权限改为 755
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod |grep -e ip_vs -e nf_conntrack_ipv4
9. 安装docker
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
yum -y install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7
使用18.06 高版本配置可能需要修改
systemctl enable docker && systemctl start docker
10. 修改资源配置
vim /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
11. 集群软件安装
yum -y install --setopt=obsoletes=0 kubeadm-1.17.2-0 kubelet-1.17.2-0 kubectl-1.17.2-0
kubeadm 初始化集群
kubelet 接受api-server 指令 管理pod
kubectl 集群命令管理工具
12. 修改配置
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
保持cgroupdriver docker与kubelet 一致
vim /etc/sysconfig/kublet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
systemctl enable kubelet
- 这里是我设置的代理 k8s 的镜像需要翻墙才能pull
mkdir -p /etc/systemd/system/docker.service.d &&
cat > /etc/systemd/system/docker.service.d/https-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=192.168.1.5:9999/" "HTTPS_PROXY=192.168.1.5:9999/" "NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,"
EOF
systemctl daemon-reload
systemctl restart docker
systemctl show --property=Environment docker
13. 保存镜像传输到其他服务器
worker 服务器只需要这两个镜像
docker save -o kube-proxy.tar k8s.gcr.io/kube-proxy
docker save -o pause .......
14. k8s 集群初始化
在master 节点
kubeadm init --kubernetes-version=v1.17.3 --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=主机ip192.168.137.132
docker pull rancher/calico-cni:v3.8.1;
docker pull rancher/calico-node:v3.8.1;
docker pull calico/kube-controllers:v3.13.0-0-g15e951d;
docker pull calico/pod2daemon-flexvol:release-v3.13;
下载 calico.yaml到~目录 我是在官网下载做了下面的修改
9 - name: CLUSTER_TYPE
620 value: "k8s,bgp"
621 # Auto-detect the BGP IP address.
622 - name: IP
623 value: "autodetect"
624 - name: IP_AUTODETECTION_METHOD
625 value: "interface=ens.*"
- name: CALICO_IPV4POOL_CIDR
639 value: "172.16.0.0/16"
15. 初始化之后需要做什么 在初始化结束会有提示
Your Kubernetes control-plane has initialized successfully!
创建文件夹
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Then you can join any number of worker nodes by running the following on each as root:
在worker节点中执行下面内容 加入集群
kubeadm join 192.168.137.132:6443 --token hbb5ve.v0ho11tpni2gjw4i \
--discovery-token-ca-cert-hash sha256:028e5215303b520ec0fa1d32e1812d238f148eb95440489dd48ffe4d4a6000f0
- 查看集群节点状态 kebectl get nodes
- 查看集群健康状态 kubecel get cs 或者 kubectl cluster-info
- 工作状态 kubectl get pods --namespace kube-system
集群工具 kubectl
有 .kube/config 才可以使用kubectl
可以将这个文件复制到 worker机器
Namespace 命名空间
- 介绍
多用户 实现资源隔离
属于逻辑隔离
属于管理边界
不属于网络边界(不需要部署多套网络构建)
可以针对每个 namespace做资源配额
- 查看 NameSpace
kubectl get namespace
default 默认
kube-node-lease 集群节点租约状态
kube-public 所有用户都可访问 包括未认证用户
kube-system kubernetes集群在使用 - 创建NameSpace
命令创建
kubectl create namespace test
yml资源清单创建
kubectl apply -f create-ns.yml
apiVersion: v1
kind: Namespace
metadata:
name: demons2
- 删除NameSpace
kubectl delete ns test1
kubectl deltete -f **.yml
最小管理单元pod
pod 是容器的封装
查看
kubectl get pods --ns default
创建
kubectl apply -f **.yml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: nginx-pod
image: nginx:latest
ports:
- name:nginxport
containerPort:80
kubectl get pods -o wide
生产环境最好不要直接访问pod
删除pod
kubectl delete pods pods1
yml文件删除
kubectl delete -f **.yml
k8s 核心概念controller 控制器
loop 方式监控pod 状态 如果发生删除会重新拉起
- 控制器作用
对应用`运行的资源对象监控
出现问题 重新拉起 达到期望状态
- 控制器分类 官网介绍更全
可以自定义 常见控制器
Deployment 声明式 更新控制器 发布无状态应用
ReplicaSet 副本集控制器 对Pod 进行规模扩大杰少
StatefulSet 有状态副本集 mysql 用于发布有状态应用
DaemonSet 每一个Node 上运行一个副本 用于发布监控或日志收集
Job 运行一次性作业任务
CronJob 运行周期性任务
- Deployment 控制器介绍、
命令创建 默认 Deployment
kubectl run nginx-app --image=nginx:latest -image-pull-policy-IfNotPresent --replicas=2 //2个pod运行
kubectl get deployment.apps
kubectl get replicaset.apps
------------------------
apiVersion: apps/v1 s
kind: Deployment
metadata:
name: nginx-app2
spec:
replicas: 1 #副本数量
selector: #标签选择器 与pod 进行关联
matchLabels:
app: nginx
template: #pod 模板
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-app2container
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: nginxapp2
containerPort: 80
- 删除应用
带有控制器的Pod 不能直接删除 会自动拉起
kubectl get deployment.apps
kubectl delete deployment.apps **
k8s 核心概念 service 服务
不是实体服务 是一条iptables 或者 ipvs 的转发规则
通过service为pod客户端提供访问pod 的方法=客户端访问pod的入口
service 同pod 标签与pod 关联
- service 类型
-- ClusterIP
默认分配一个集群内部可以访问的虚拟ip
-- NodePort
在每一个Node 上分配一个端口作为外部访问
-- oadBalancer
工作在特定的 云服务上 aws openstart
-- ExternalName
表示把几圈外部服务引入到集群内部来实现进群内部pod 与集群外部的服务进行通信
- service 常用参数
port 访问service使用的端口
targetPort pod 中容器端口
NodePort 通过 Node 实现外网访问k8s 内service (30000-32767)
- 创建 service
命令行创建 默认创建为ClusterIp
先创建应用
kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=1
创建service
kubectl expose deployment.apps nginx-app --type=ClusterIP --target-port=80 --port=80
- yml 创建service
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app2
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginapp2
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-app2
spec:
type: ClusterIP
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
- 查看
kubectl get service
kubectl get endpoints
- 创建 NodePort 类型的service 只需要修改type即可
- service 自带负载均衡 均匀访问多个 pod