K8S本地环境搭建
K8S本地环境搭建K8S本地环境搭建
K8S本地环境搭建
笔记出自马士兵 【架构师高级技能kubernetes入门到精通】整理
目录
1.环境准备命令
1.1设置主机名与时区
timedatectl set-timezone Asia/Shanghai #都要执行
hostnamectl set-hostname node1 #133执行
hostnamectl set-hostname node2 #137执行
1.2添加hosts网络主机配置,三台虚拟机都要设置
vim /etc/hosts
192.168.163.132 master
192.168.163.133 node1
192.168.163.137 node2
vim /etc/hosts
192.168.56.100 master
192.168.56.101 node1
192.168.56.102 node2
1.3关闭防火墙,三台虚拟机都要设置,生产环境跳过这一步
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld
2. 安装Kubeadmin加载K8S镜像
2.1将镜像包上传至服务器每个节点
mkdir /usr/local/k8s-install
cd /usr/local/k8s-install
# XFTP上传安装文件
2.2按每个Centos上安装Docker
tar -zxvf docker-ce-18.09.tar.gz
cd docker
yum localinstall -y *.rpm
systemctl start docker
systemctl enable docker
2.3确保从cgroups均在同一个从groupfs
#cgroups是control groups的简称,它为Linux内核提供了一种任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。
#cgroups是实现IaaS虚拟化(kvm、lxc等),PaaS容器沙箱(Docker等)的资源管理控制部分的底层基础。
#子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。
#在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源
docker info | grep cgroup
# 如果不是groupfs,执行下列语句
cat << EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=cgroupfs"]
}
EOF
systemctl daemon-reload && systemctl restart docker
2.4安装kubeadm
# ubeadm是集群部署工具
cd /usr/local/k8s-install/kubernetes-1.14
tar -zxvf kube114-rpm.tar.gz
cd kube114-rpm
yum localinstall -y *.rpm
2.5关闭交换区
swapoff -a
vi /etc/fstab
#swap一行注释
2.6配置网桥
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
2.7通过镜像安装k8s
cd /usr/local/k8s-install/kubernetes-1.14
docker load -i k8s-114-images.tar.gz
docker load -i flannel-dashboard.tar.gz
3.利用Kubeadm部署K8S集群
3.1master主服务器配置
kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10.244.0.0/16
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
#查看存在问题的pod
kubectl get pod --all-namespaces
#设置全局变量
#安装flannel网络组件
kubectl create -f kube-flannel.yml
3.2加入NODE节点
kubeadm join 192.168.4.130:6443 --token 911xit.xkp2gfxbvf5wuqz7 \
--discovery-token-ca-cert-hash sha256:23db3094dc9ae1335b25692717c40e24b1041975f6a43da9f43568f8d0dbac72
# 如果忘记
# 在master 上执行kubeadm token list 查看 ,在node上运行
kubeadm join 192.168.163.132:6443 --token aoeout.9k0ybvrfy09q1jf6 --discovery-token-unsafe-skip-ca-verification
# kubeadm join 10.0.2.15:6443 --token 6sn3eb.fhnypx6mzzaory4v \
# --discovery-token-ca-cert-hash sha256:569c583dc21d1bdd9e16c63a41e1f1c2c6a4b027af9e73770ebceff0ed3f6a25
# 查看节点状态
kubectl get nodes
3.3Master开启仪表盘
kubectl apply -f kubernetes-dashboard.yaml
kubectl apply -f admin-role.yaml
kubectl apply -f kubernetes-dashboard-admin.rbac.yaml
kubectl -n kube-system get svc
# http://192.168.163.132:32000 访问
3.4启动节点命令 | 避免k8s 开机不自启
# 启动节点的K8S服务
systemctl start kubelet
# 设置开机启动
systemctl enable kubelet
4.k8s常用命令学习
4.1 架构图
4.1.1 POD(豆荚)
-
POD是”容器”的容器,可以包含多个”Container”
-
POD是K8S最小可部署单元,一个POD就是一个进程
-
POD内部容器网络互通,每个POD都有独立虚拟IP
-
POD都是部署完整的应用或模块
4.1.2 Pause容器
4.1.3 SERVICE(服务)
4.1.1 POD(豆荚)
-
POD是”容器”的容器,可以包含多个”Container”
-
POD是K8S最小可部署单元,一个POD就是一个进程
-
POD内部容器网络互通,每个POD都有独立虚拟IP
-
POD都是部署完整的应用或模块
4.1.2 Pause容器
4.1.3 SERVICE(服务)
4.2 kubeadm/kubelet/kubectl区别
-
kubeadm是kubernetes集群快速构建工具
-
kubelet运行在所有节点上,负责启动POD和容器,以系统服务形式出现
-
kubectl:kubectl是kubenetes命令行工具,提供指令
4.3部署相关的指令
kubectl create -f 部署yml文件 #创建部署
kubectl apply -f 部署yml文件 #更新部署配置
kubectl get pod [-o wide] #查看已部署pod
kubectl describe pod pod名称 #查看Pod详细信息
kubectl logs [-f] pod名称 #查看pod输出日志
4.4 K8S部署调整命令
# 更新集群配置
kubectl apply -f yml文件路径
# 删除部署(Deployment)|服务(Service)
kubectl delete deployment|service 部署|服务名称
4.5 K8S运维命令
# 查看指定名称空间的pods
kubectl get pods -n kube-system
# 查看所有名称空间的pods
kubectl get pods -all-namespace
# 查看master上的节点信息
kubectl get nodes
# 监控pod进度 打印详细信息
watch kubectl get pod -n kube-system -o wide
# 获取所有的资源
kubectl get all
# 获取所有 详细部署信息
kubectl get all -o wide
4.5 K8S部署入门案例
4.5.1 nginx
第一步:在master 节点上创建一个deployment
kubectl create deployment nginx --image=nginx
效果如下,可以看到一个叫nginx的deployment创建成功了。
root@ubuntu:/home/cong# kubectl create deployment nginx --image=nginxdeployment.apps/nginx created root@ubuntu:/home/cong# kubectl get deploymentsNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEnginx 1 1 1 1 11m
第二步:创建一个service
kubectl create service nodeport nginx --tcp 80:80
效果如下,可以看到一个叫nginx的service创建成功了,这里kubectl get svc是kubectl get services的简写。
root@ubuntu:/home/cong# kubectl create service nodeport nginx --tcp 80:80service/nginx created
root@ubuntu:/home/cong# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3dnginx NodePort 10.107.237.157 <none> 80:30601/TCP 11s
在slave节点上执行下面的命令验证一下nginx有没有部署成功。
note1节点名称
curl localhost:30601 或者 curl note1:30601
效果如下:
root@ubuntu:/home/cong# curl localhost:30601
<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; }</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p> <p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p></body></html>
用浏览器打开试试,nginx的首页显示出来了。
简单吧,是不是信心大增了?!
为了练习更多复杂的命令,我们将上面建好的deployments/nginx, services/nginx 删除先,命令如下:
root@ubuntu:/home/cong# kubectl delete deployments/nginx services/nginxdeployment.extensions "nginx" deletedservice "nginx" deleted
好了,你应用程序部署的处女作就完美结束了
4.5.2 tomcat
# 在主节点上部署一个tomcat
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8
# 获取所有的资源
kubectl get all
# 查看部署信息
kubectl get all -o wide
# 删除部署信息 <根据实际情况而定>
kubectl delete deployment.apps/tomcat6
[root@master test]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/tomcat6-7459c6cbcd-hfvhs 0/1 ContainerCreating 0 43m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 19h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/tomcat6 0/1 1 0 13h
NAME DESIRED CURRENT READY AGE
replicaset.apps/tomcat6-7459c6cbcd 1 1 0 13h
[root@master test]# kubectl delete deployment.apps/tomcat6
deployment.apps "tomcat6" deleted
[root@master test]# kubectl get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 19h
4.6 k8s yaml编写
4.6.1必需字段
在想要创建的 Kubernetes 对象对应的 .yaml
文件中,需要配置如下的字段:
apiVersion
- 创建该对象所使用的 Kubernetes API 的版本kind
- 想要创建的对象的类型metadata
- 帮助识别对象唯一性的数据,包括一个name
字符串、UID 和可选的namespace
也需要提供对象的 spec
字段。对象 spec
的精确格式对每个 Kubernetes 对象来说是不同的,包含了特定于该对象的嵌套字段。Kubernetes API 参考能够帮助我们找到任何我们想创建的对象的 spec 格式。
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
4.6.2 kind 中定义yaml类型
我将它们简单的分类为以下几种资源对象:
类别 | 名称 |
---|---|
资源对象 | Pod、ReplicaSet、ReplicationController、Deployment、StatefulSet、DaemonSet、Job、CronJob、HorizontalPodAutoscaling、Node、Namespace、Service、Ingress、Label、CustomResourceDefinition |
存储对象 | Volume、PersistentVolume、Secret、ConfigMap |
策略对象 | SecurityContext、ResourceQuota、LimitRange |
身份对象 | ServiceAccount、Role、ClusterRole |
4.6.3 项目部署较为合理的方案
项目部署流程
-
定义一个命名空间进行资源之间的隔离
创建pxc namespace
kubectl create namespace pxc
kubectl config set-context $(kubectl config current-context) -n pxc
-
项目资源准备
- 将准备好jar openjdk 或 war 将打包好 环境导入docker images
- 配置 yaml 文件进行数据导入
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat-deploy
spec:
replicas: 2
template:
metadata:
labels:
app: tomcat-cluster
spec:
# 目录挂载
volumes:
- name: web-app
hostPath:
path: /mnt
containers:
# 容器名称
- name: tomcat-cluster
image: tomcat:latest
# 资源限定
resources:
requests:
# 最小容器启用要求
# 说明:必须满足以下要求才能创建容器
cpu: 0.5
memory: 200Mi
# 最大容器启用要求 最多能使用一核cpu 512mb 内存
limits:
cpu: 1
memory: 512Mi
ports:
# containerPort 容器内暴露的端口
- containerPort: 8080
# 容器内目录挂载
volumeMounts:
- name: web-app
mountPath: /usr/local/tomcat/webapps
---
apiVersion: v1
kind: Service
metadata:
name: beiqin-db-service
labels:
app: beiqin-db-service
spec:
# 开外网访问模式 开启两个选项 type nodePort
# type: NodePort
selector:
# Deployment 名称
app: beiqin-db-deploy
ports:
# mast节点暴露的端口
- port: 3306
targetPort: 3306
# node 暴露的端口自己暴露的端口
# 存在范围限制 30001 - 32500
nodePort: 30001
4.6.4 项目部署实战
# 部署jar
# 部署
kubectl apply -f beiqin-db-service.yml
# 使用k8s 进入指定容器
kubectl exec -it beiqin-db-deploy-64ff44784d-f9c97 /bin/bash
# 获取指定pod id
kubectl get pod
4.7 k8s 端口转发
# 使用rinetd 进行端口转发
cd /usr/local
wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
tar -zxvf rinetd.tar.gz
cd rinetd
sed -i 's/65536/65535/g' rinetd.c
mkdir -p /usr/man/
yum install -y gcc
make && make install
# 添加端口转发
vi /etc/rinetd.conf
# 安装net-tools
yum install net-tools
rinetd -c /etc/rinetd.conf
# 查看暴露端口
netstat -tulpn
4.8 腾讯云文档
kubectl常用示例
查看类命令
# 获取节点和服务版本信息
kubectl get nodes
# 获取节点和服务版本信息,并查看附加信息
kubectl get nodes -o wide
# 获取pod信息,默认是default名称空间
kubectl get pod
# 获取pod信息,默认是default名称空间,并查看附加信息【如:pod的IP及在哪个节点运行】
kubectl get pod -o wide
# 获取指定名称空间的pod
kubectl get pod -n kube-system
# 获取指定名称空间中的指定pod
kubectl get pod -n kube-system podName
# 获取所有名称空间的pod
kubectl get pod -A
# 查看pod的详细信息,以yaml格式或json格式显示
kubectl get pods -o yaml
kubectl get pods -o json
# 查看pod的标签信息
kubectl get pod -A --show-labels
# 根据Selector(label query)来查询pod
kubectl get pod -A --selector="k8s-app=kube-dns"
# 查看运行pod的环境变量
kubectl exec podName env
# 查看指定pod的日志
kubectl logs -f --tail 500 -n kube-system kube-apiserver-k8s-master
# 查看所有名称空间的service信息
kubectl get svc -A
# 查看指定名称空间的service信息
kubectl get svc -n kube-system
# 查看componentstatuses信息
kubectl get cs
# 查看所有configmaps信息
kubectl get cm -A
# 查看所有serviceaccounts信息
kubectl get sa -A
# 查看所有daemonsets信息
kubectl get ds -A
# 查看所有deployments信息
kubectl get deploy -A
# 查看所有replicasets信息
kubectl get rs -A
# 查看所有statefulsets信息
kubectl get sts -A
# 查看所有jobs信息
kubectl get jobs -A
# 查看所有ingresses信息
kubectl get ing -A
# 查看有哪些名称空间
kubectl get ns
# 查看pod的描述信息
kubectl describe pod podName
kubectl describe pod -n kube-system kube-apiserver-k8s-master
# 查看指定名称空间中指定deploy的描述信息
kubectl describe deploy -n kube-system coredns
# 查看node或pod的资源使用情况
# 需要heapster 或metrics-server支持
kubectl top node
kubectl top pod
# 查看集群信息
kubectl cluster-info 或 kubectl cluster-info dump
# 查看各组件信息【172.16.1.110为master机器】
kubectl -s https://172.16.1.110:6443 get componentstatuses
操作类命令
# 创建资源
kubectl create -f xxx.yaml
# 应用资源
kubectl apply -f xxx.yaml
# 应用资源,该目录下的所有 .yaml, .yml, 或 .json 文件都会被使用
kubectl apply -f <directory>
# 创建test名称空间
kubectl create namespace test
# 删除资源
kubectl delete -f xxx.yaml
kubectl delete -f <directory>
# 删除指定的pod
kubectl delete pod podName
# 删除指定名称空间的指定pod
kubectl delete pod -n test podName
# 删除其他资源
kubectl delete svc svcName
kubectl delete deploy deployName
kubectl delete ns nsName
# 强制删除
kubectl delete pod podName -n nsName --grace-period=0 --force
kubectl delete pod podName -n nsName --grace-period=1
kubectl delete pod podName -n nsName --now
# 编辑资源
kubectl edit pod podName
进阶命令操作
# kubectl exec:进入pod启动的容器
kubectl exec -it podName -n nsName /bin/sh #进入容器
kubectl exec -it podName -n nsName /bin/bash #进入容器
# kubectl label:添加label值
kubectl label nodes k8s-node01 zone=north #为指定节点添加标签
kubectl label nodes k8s-node01 zone- #为指定节点删除标签
kubectl label pod podName -n nsName role-name=test #为指定pod添加标签
kubectl label pod podName -n nsName role-name=dev --overwrite #修改lable标签值
kubectl label pod podName -n nsName role-name- #删除lable标签
# kubectl滚动升级; 通过 kubectl apply -f myapp-deployment-v1.yaml 启动deploy
kubectl apply -f myapp-deployment-v2.yaml #通过配置文件滚动升级
kubectl set image deploy/myapp-deployment myapp="registry.cn-beijing.aliyuncs.com/google_registry/myapp:v3" #通过命令滚动升级
kubectl rollout undo deploy/myapp-deployment 或者 kubectl rollout undo deploy myapp-deployment #pod回滚到前一个版本
kubectl rollout undo deploy/myapp-deployment --to-revision=2 #回滚到指定历史版本
# kubectl scale:动态伸缩
kubectl scale deploy myapp-deployment --replicas=5 # 动态伸缩
kubectl scale --replicas=8 -f myapp-deployment-v2.yaml #动态伸缩【根据资源类型和名称伸缩,其他配置「如:镜像版本不同」不生效】
上面滚动更新和动态伸缩涉及的deploy的yaml文件
[root@k8s-master deploy]# cat myapp-deployment-v1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
labels:
app: myapp
spec:
replicas: 10
# 重点关注该字段
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
ports:
- containerPort: 80
[root@k8s-master deploy]#
[root@k8s-master deploy]# cat myapp-deployment-v2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
labels:
app: myapp
spec:
replicas: 10
# 重点关注该字段
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v2
ports:
- containerPort: 80
kubectl语法
kubectl [command] [TYPE] [NAME] [flags]
官网地址:https://kubernetes.io/docs/reference/kubectl/overview/
kubectl flags:https://kubernetes.io/docs/reference/kubectl/kubectl/
说明:
1、command:指定在一个或多个资源上要执行的操作。例如:create、get、describe、delete、apply等
2、TYPE:指定资源类型(如:pod、node、services、deployments等)。资源类型大小写敏感,可以指定单数、复数或缩写形式。例如,以下命令生成相同的输出:
kubectl get pod -n kubernetes-dashboard
kubectl get pods -n kubernetes-dashboard
kubectl get po -n kubernetes-dashboard
3、NAME:指定资源的名称。名称大小写敏感。如果省略名称空间,则显示默认名称空间资源的详细信息或者提示:No resources found in default namespace.。
# 示例:
[root@k8s-master ~]# kubectl get pods
No resources found in default namespace.
[root@k8s-master ~]# kubectl get pods --all-namespaces # 或者 kubectl get pods --A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6955765f44-c9zfh 1/1 Running 8 6d7h
kube-system coredns-6955765f44-lrz5q 1/1 Running 8 6d7h
kube-system etcd-k8s-master 1/1 Running 9 6d7h
kube-system kube-apiserver-k8s-master 1/1 Running 9 6d7h
kube-system kube-controller-manager-k8s-master 1/1 Running 8 6d7h
kube-system kube-flannel-ds-amd64-dngrk 1/1 Running 13 6d7h
kube-system kube-flannel-ds-amd64-h4sn6 1/1 Running 13 6d6h
kube-system kube-flannel-ds-amd64-m92wp 1/1 Running 11 6d6h
kube-system kube-proxy-28dwj 1/1 Running 9 6d6h
kube-system kube-proxy-c875m 1/1 Running 8 6d7h
kube-system kube-proxy-stg6w 1/1 Running 10 6d6h
kube-system kube-scheduler-k8s-master 1/1 Running 9 6d7h
kubernetes-dashboard dashboard-metrics-scraper-7b8b58dc8b-nr5fz 1/1 Running 7 6d1h
kubernetes-dashboard kubernetes-dashboard-755dcb9575-9kg7p 1/1 Running 9 6d1h
[root@k8s-master ~]# kubectl get service --all-namespaces # 或者 kubectl get service -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d7h
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 6d7h
kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.104.12.221 <none> 8000/TCP 6d1h
kubernetes-dashboard kubernetes-dashboard NodePort 10.110.157.29 <none> 443:30001/TCP 6d1h
3、flags:指定可选的标记。例如,可以使用 -s 或 --server标识来指定Kubernetes API服务器的地址和端口;-n指定名称空间;等等。
注意:你从命令行指定的flags将覆盖默认值和任何相应的环境变量。优先级最高。
4、在多个资源上执行操作时,可以通过类型 [TYPE] 和名称 [NAME] 指定每个资源,也可以指定一个或多个文件。
按类型和名称指定资源:
# 查看一个资源类型中的多个资源
[root@k8s-master ~]# kubectl get pod -n kube-system coredns-6955765f44-c9zfh kube-proxy-28dwj
NAME READY STATUS RESTARTS AGE
coredns-6955765f44-c9zfh 1/1 Running 8 6d7h
kube-proxy-28dwj 1/1 Running 9 6d6h
[root@k8s-master ~]#
# 查看多个资源类型
[root@k8s-master ~]# kubectl get svc,node
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 45h
NAME STATUS ROLES AGE VERSION
node/k8s-master Ready master 45h v1.17.4
node/k8s-node01 Ready <none> 45h v1.17.4
node/k8s-node02 Ready <none> 45h v1.17.4
使用一个或多个文件指定资源:-f file1 -f file2 -f file<#>
# 使用YAML而不是JSON,因为YAML更容易使用,特别是对于配置文件。
kubectl get pod -f pod.yaml
kubectl语法中的command操作
下表包括常见kubectl操作的简短描述和通用语法:
也可在命令行可通过kubectl -h 命令获取部分信息 或者通过以下地址查看更多详情:
更多推荐
所有评论(0)