一、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、界面

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐