Linux 安装k8s 我自己的宝藏
【代码】Linux 安装k8s 我自己的宝藏。
一、kubernetes 安装
1、安装前置环境(都执行)
1、基础环境
所有机器执行以下操作:
#关闭防火墙:如果是云服务器,需要设置安全组策略放行端口
systemctl stop firewalld
systemctl disable firewalld
#各个机器设置自己的域名
hostnamectl set-hostname xxxx
#查看修改结果
hostname
#设置hostname解析
echo "127.0.0.1 $(hostname)" >> /etc/hosts
# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
#关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
#允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
#设置
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
2、docker 环境
#移除以前docker相关包
sudo yum remove docker*
#配置yum源
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker
yum install -y docker-ce-19.03.1 docker-ce-cli-19.03.1 containerd.io-1.4.6
#启动docker
systemctl enable docker --now
#配置加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3、安装k8s核心(每台服务器都执行)
#配置k8s的yum源
cat <<EOF | sudo tee /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
exclude=kubelet kubeadm kubectl
EOF
# 卸载旧版本
yum remove -y kubelet kubeadm kubectl
#安装 kubelet kubeadm kubectl 指定版本
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
#开机自启kubelet
sudo systemctl enable --now kubelet
4、初始化master节点 (master执行)
#下载各个机器需要的镜像
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF
chmod +x ./images.sh && ./images.sh
#创建k8s集群
kubeadm init \
--apiserver-advertise-address=10.23.0.16 \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16
#master 初始化的日志
Your Kubernetes control-plane has initialized successfully!
##init 完成后第一步:复制相关文件夹
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
## 导出环境变量
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
##部署一个pod网络
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
########################## 如下:安装calico ###########################
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.23.0.16:6443 --token 2zfxoz.9isw7jkd7f7vswux \
--discovery-token-ca-cert-hash sha256:6a44811d8cbb4f06275891a566818d42e96db43dbedfa863f966a83ec0b3b968
5、token 过期了怎么办(生成新的令牌)
kubeadm token create --print-join-command
6、给节点打标签
#获取所有节点(给node节点打标签)
kubectl get nodes
#给节点打标签
##k8s 中万物皆对象。node:机器 pod:应用容器
###加标签
kubectl label node k8s-node1 node-role.kubernetes.io/worker=''
###去标签
kubectl label node k8s-node1 node-role.kubernetes.io/worker-
# 获取节点详细信息
kuebctl get node --show-labels
------------------------------------------------------------------------------------------
##给pod节点打标签
# 获取pod详细信息
kubectl get pod --show-labels
# 给pod打标签
kubectl label pod my-nginx-6b74b79f57-6jqpr hello=8888
# 修改pod标签
kubectl label pod my-nginx-6b74b79f57-6jqpr --overwrite hello=7777
7、设置ipvs模式
k8s整个集群为了访问通;默认是用iptables,性能下降(kube-proxy在集群之间同步iptables的内容)
#1、查看默认kube-proxy 使用的模式
kubectl logs -n kube-system kube-proxy-28xv4
#2、需要修改 kube-proxy 的配置文件,修改mode为ipvs,默认iptables,但是集群大了以后就会很慢
kubectl edit cm kube-proxy -n kube-system
修改如下:
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
strictARP: false
syncPeriod: 0s
tcpFinTimeout: 0s
tcpTimeout: 0s
udpTimeout: 0s
kind: KubeProxyConfiguration
metricsBindAddress: ""
mode:"ipvs"
###修改完成后可以重启kube-proxy生效
#重启kube-proxy
1、kubectl get pod -A #查找到kube-proxy
2、 kubectl get pod -A -owide #查看详细信息
#杀死之前的kube-proxy
kubectl delete pod (pod名称、可批量) -n 名称空间
kubectl delete pod kube-proxy-bkc7q kube-proxy-d87bs kube-proxy-lk67w -n kube-system
二、kubernetes基础入门
1、基础知识
以上展示一个master(主节点)和6个worker(工作节点)的k8s集群
# docker run --name hello-pod alpine 是跑一个容器,容器的粒度有点小
kubectl run hello-pod --image=alpine #跑一个pod ,pod里面其实也是容器
# 对比
kubectl get pod #以前的docker ps -a
## 所有kubectl在master节点运行,把命令请求发给api-server。api-server一系列处理
## master只复制调度,而worker node才是真正部署应用的。
master节点的关键组件:
1、kubelet(监工):所有节点必备的。控制这个节点所有pod的生命周期又api-server交互工作
2、kube-api-server:负责接收所有请求。集群内对集群的任何修改都是通过命令行、ui 把请求发给api-server才能执行的。api-server是整个集群操作对内、对外的唯一入口。不包含我们后来部署应用暴露端口的方式
3、kube-proxy:整个节点的网络流量负责
3、cri: 都有容器运行时环境
worker 节点:
1、kubelet (监工):所有节点必备的控制这个节点所有pod的生命周期以及与api-server交互等工作
2、kube-proxy :整个节点的网络流量负责
3、cri: 都有容器运行时环境
2、部署一个应用
# kubectl create 帮我们创建k8s集群中的一些对象
kubectl create --help
kubectl create deployment 这次部署的名字 --image=应用的镜像
#创建一个nginx
kubectl create deployment my-nginx --image=nginx
##最终在一个机器上有pod、这个pod其实本质里面就是一个容器
k8s_nginx_my-nginx-6b74b79f57-59c2d_default_e296732e-fa8d-442e-a30a-f0a49909b59c_0
### k8s_镜像(nginx)_pod名(my-nginx-6b74b79f57-59c2d)_容器名(default_e296732e-fa8d-442e-a30a-f0a49909b59c_0)
#做了一次部署,获取这次部署操作
kubectl get deploy
#获取所有
kubectl get all
#获取刚部署的更加全面的信息
kubectl get pod -o wide
#通过kubectl run 起来的pod的可以直接删除
kubectl delete pod pod名称
##通过 kubectl create deploy部署的项目 要想删除这个pod 就的删除deploy
1、查看通过deploy部署的那些项目:kubectl get deploy
2、删除通过deploy部署的项目: kubectl delete deploy 项目名称
#即想看deploy部署的项目名称,又想看这个pod名称组合名称
kubectl get deploy,pod
自愈:针对使用Deployment等部署的应用
kubectl run : 直接启动一个pod;不会产生一次部署信息。所以删除就没
kubectl create deploy :启动一个pod,以及记录这次部署信息,所以,这个pod即使挂了,这次部署信息有,就会强制同步到这次部署信息期望的最终结果; kubectl get deploy,pod 都有内容
3、应用程序探索
创建Deployment后,k8s创建一个Pod(容器组)来放置应用程序实例(container容器)
1、了解Pod
2、了解Node
kubelet 启动的Pod每个都有IP,全集群任意均可访问
kubeadm init \
--apiserver-advertise-address=10.23.0.16 \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16--pod-network-cidr=192.168.0.0/16 :pod的IP范围
--service-cidr=10.96.0.0/16 \ :把各个pod注册到一个service服务里IP范围
calico : 网络组件:
【扁平化网络】
3、故障排除
>>> kubectl get -显示资源列表
# kubectl get 资源类型
# 获取类型为depoyment 的资源列表
kubectl get deployment
# 获取类型为pod的资源列表
kubectl get pods
# 获取类型为Node的资源列表
kubectl get nodes
--------------------------------------------------------------------------------------
# 查看所有名称空间的Deployment
kubectl get deployments -A
kubectl get deployments --all -namespaces
# 查看kube-system 名称空间的 Depolyment
kubectl get deployments -n kube-system
---------------------------------------------------------------------------------------
#####并不是所有的对象都在名称空间中
# 通过这个命令可以获取到k8s底层所有的资源
# 在名称空间里
kubectl api-resources --namespaced=true
# 不在名称空间里
kubectl api-resources --namespaced=false
>>> kubectl describe -显示有关资源的详细信息(所有的资源都能描述)
# kubectl describe 资源类型 资源名称
# 查看名称为nginx-xxxx的pod的信息
kubectl describe pod nginx-xxxx
# 查看名称为nginx的Deployment的信息
kubectl describe deployment my-nginx
>>> kubectl exec -在pod中的容器环境内执行命令(和命令docker exec 类似)
# kubectl exec Pod名称 操作命令
# 在名称为nginx-pod-xxx的pod中运行bash
kubectl exec -it nginx-pod /bin/bash
4、应用外部可见
1、Kubernetes Service 总览
2、Service 和 Label
3、kubectl expose (快速暴露)
kubectl expose deployment my-nginx --port=8912 --target-port=80 --type=NodePort
## --port:集群内访问service的端口:8912
## --tatget-port:pod容器的端口:80
## --NodePort:每个机器开发的端口:30403
## 进行验证
kubectl get svc
curl ip:port
## kubectl exec 进去pod修改,并测试负载均衡
--------------------------------------------------------------------------------------------------------------------------------
clusterIP:集群IP
---------------------------------------------------------------------------------------------------------------------------------
说明:每个机器都开了这个端口
-------------------------------------------------------------------------------------------------------------------------------
又添加一个副本:(负载均衡网络只要是创建好的pod只要是动态扩容了,就会自动加入到这个service里)
5、伸缩应用程序--扩缩容
## 扩容的pod会自动加入到他之前存在的Service(负载均衡网络)
kubectl scale --replicas=3 deploy my-nginx
## 缩容
kubectl scale --replicas=3 deploy my-nginx #--replicas=3 修改这个数值就行
#持续观测效果
watch kubectl get pods -o wide
#1秒一次
watch -n 1 kubectl get pods -o wide
6、执行滚动升级
# 查看容器名镜像的命令
1、kubectl get pod
my-nginx-6b74b79f57-6jqpr 1/1 Running 0 4h10m
my-nginx-6b74b79f57-6n6gt 1/1 Running 0 118m
my-nginx-6b74b79f57-qsdwf 1/1 Running 0 4h10m
2、kubectl get pod my-nginx-6b74b79f57-6jqpr -o yaml | grep name
f:name: {}
k:{"name":"nginx"}:
f:name: {}
name: my-nginx-6b74b79f57-6jqpr
namespace: default
name: my-nginx-6b74b79f57
name: nginx
name: default-token-gr899
- name: default-token-gr899
name: nginx ##--->这个就是,pod有一个容器叫nginx
#对服务器版本进行升级
kubectl set image deploy my-nginx nginx=nginx:1.9.1
###现在升级突然炸了,怎么回滚到之前的状态
# 查看部署的历史命令
kubectl rollout history deploy my-nginx
现在的问题升级了版本了光秃秃的,升级了什么都不知到(升级版本没有记录)
# 版本升级加上版本记录
kubectl set image deploy my-nginx nginx=nginx:22222 --record
##--record 这个就是开启版本记录
退回到之前的任意版本:
# 退回到之前的版本,退到那个版本自己写
kubectl rollout undo deploy my-nginx --to-revision=1
7、以上用配置文件方式
1、部署一个应用
apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment #该配置的类型,我们使用的是 Deployment
metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
labels:
app: my-dep
name: my-dep
spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
replicas: 3 #使用该Deployment创建一个应用程序实例
selector: #标签选择器,与上面的标签共同作用
matchLabels: #选择包含标签app:nginx 的资源
app: my-dep
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: my-dep
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container ,与docker中的container是同一种
- image: nginx #container 的名称
name: nginx #使用镜像nignx 创建container,该container默认80端口可访问
# 通过使用yaml文件部署pod
kubectl apply -f yaml 文件
#部署的Pod通过yaml进行删除
kubectl delete -f yaml 文件
8、描述k8s对象
## 如何会写任意资源的yaml,比如Pod
## kubectl run my-nginx888 --image=nginx #启动一个Pod
## 1、kubectl get pod my-nginx888 -oyaml #集群中挑一个同类资源,获取出它的yaml
## 2、kubectl run my-tomact --image=tomcat --dry-run -oyaml #干跑一趟,不会有真实实例
apiVersion: v1 # 同一个资源有可能有多个版本。看kubectl api-resources提示的
kind: Pod # 资源类型 :kubectl api-resources:可以获取到所有资源
metadata: #每一个资源定义一些元数据信息
labels:
run: my-tomact
name: my-tomact
spec: #资源的规格(镜像名、镜像的环境变量信息等等)
containers:
- image: tomcat
name: my-tomact
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
9、名称空间(NameSpace)
Kubernetes 安装成功后,默认有初始化了三个空间:
。default 默认名称空间,如果Kubernetes对象中不定义metadata.namespace字段,该对象将放在此名称空间下
。kube-system Kubernetes系统创建的对象放在此名称空间下
。kube-public 此名称空间自动在安装集群是自动创建,并且所有用户都是可以读取的(即使是那些未登录的用户)。主要是为集群预留的,例如,某些情况下,某些Kubernetes对象应该被所有集群用户看到
名称空间里的资源不能共享,资源那些能共享?同一名称空间下的资源可以共享,不同名称空间下的资源不能共享,不同名称空间下的网络可以互通。
名称空间未来如何隔离
1)、基于环境隔离(prod,test)
prod: 部署的所有应用
test:部署的所有应用隔离
2)、基于产品线的名称空间(商城、Android、iOS、backend)
3)、基于团队隔离
# 创建一个名称空间
kubectl create ns aaa
#删除一个名称空间
kubectl delete ns aaa
##删除名称空间这个名称空间下的所有资源默认都会删除########
#干跑一个名称空间,拿到它的yaml
kubectl create ns hello --dry-run=client -oyaml
# 使用资源配置文件的方式创建名称空间
apiVersion: v1
kind: Namespace
metadata:
name: hello888
spec: {}
10、标签和选择器
k8s每一个资源都可以打标签,打完标签以后方便我们选择
给my-nginx888打标签
# 给my-nginx888打标签
kubectl label pod my-nginx888 aaa=bbb
#查看标签打成功了没有
kubectl get pod --show-labels
#删除标签命令
kubectl label pod my-nginx888 aaa-
通过yaml打标签
apiVersion: v1 # 同一个资源有可能有多个版本。看kubectl api-resources提示的
kind: Pod # 资源类型 :kubectl api-resources:可以获取到所有资源
metadata: #每一个资源定义一些元数据信息
labels:
run: my-tomact
name: my-tomact
labels: #这个就是打标签的字段
app=my-tomact #写多少个标签它就打多少个
aab=bb
spec: #资源的规格(镜像名、镜像的环境变量信息等等)
containers:
- image: tomcat
name: my-tomact
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
三、其他
1、部署dashboard
1、部署
kubernetes官方提供的可视化界面
GitHub - kubernetes/dashboard: General-purpose web UI for Kubernetes clusters
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
2、设置访问端口
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
type: ClusterIP 改为 type: NodePort
## 找到端口,在安全组放行
kubectl get svc -A |grep kubernetes-dashboard
访问: https://集群任意IP:端口 https://139.198.165.238:32759
3、创建访问账号
#创建访问账号,准备一个yaml文件; vi dash.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
# 生成一个pod
kubectl apply -f dash.yaml
4、令牌访问
#获取访问令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
eyJhbGciOiJSUzI1NiIsImtpZCI6InVjakhZemtNYzF5RS0zTUVKNHQ4cHJOV0stWW5idU44TUVDMlBmUTNrdEEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWdmdm5sIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NWY3NDNlZC1lYmZlLTQ1MWQtYTQ1My00OGViZTA2MGFjNmMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.MBBgsw21Y3viRFLkTczVM-49zKHwGY_2fO0UrmCMo3NZ-hPm7dfsjRK40r29wRJsy5Z4tWhZ0cAVHr_3MwugoRS8NDd_XlP4oyfQVuIhfWXMPjECmGmU2HU9J4aLF5T6UKJUU-JemQ0IhcapFbZ1CXQkRnhHNYH9-7NGAENZdjDZQGcNOQAnQQjhJZMhbgcb0JWJQA8GXe9AH-Tr8wwCBnCQKwkT8tJi7uMXyjTFP-MBHlch1yPJ4X1mBGL4UiAf2EydyZQDH7WZyO26clwJ0z2xAscKcVPv3UT6rNwYsttVPVA7xgxtt7HMekVRf7o5LJELx0JtINX-mUPOUCnOhQ
5、界面
更多推荐
所有评论(0)