Kubernetes and docker -- 2. Learning pod resources

I only hope to have a white head 2021-02-23 14:20:03
kubernetes docker learning pod resources


Pod--k8s The most basic resources

What we want is a single container running only one process

But sometimes we need multiple processes to work together , So we need another, more advanced structure to put containers together ---pod

Pod

  1. Let's take a look at the most basic pod

    This pod Of image It's my basis centos:7 The image of , It's simple , mirrored Dockerfile as follows :

    FROM 192.168.80.84:5000/centos:7
    entrypoint ["sleep"]
    cmd ["999"]
    # A container must have a daemon to run
    # In other words , hold Dockerfile Medium sleep Order to remove , A simple one centos It doesn't work
    

    We take this image as pod Of image Run up :

    kubectl run my-cmd --image=192.168.80.84:5000/centos_cmd:v1


    Use -o yaml Take a look at the corresponding yaml file :

    [root@k8s-master01 centos]# kubectl get pod my-cmd -o yaml
    apiVersion: v1 # Appoint apiVersion edition
    kind: Pod # The corresponding resource type , Here for pod
    metadata: # Instance metadata
    creationTimestamp: "2021-01-13T02:36:02Z"
    labels: # Automatically label instances
    run: my-cmd
    managedFields: # A set of fields for internal management
    - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
    f:metadata:
    f:labels:
    .: {}
    f:run: {}
    f:spec:
    f:containers:
    k:{"name":"my-cmd"}:
    .: {}
    f:image: {}
    f:imagePullPolicy: {}
    f:name: {}
    f:resources: {}
    f:terminationMessagePath: {}
    f:terminationMessagePolicy: {}
    f:dnsPolicy: {}
    f:enableServiceLinks: {}
    f:restartPolicy: {}
    f:schedulerName: {}
    f:securityContext: {}
    f:terminationGracePeriodSeconds: {}
    manager: kubectl-run # Write down that pod Mode of starting
    operation: Update
    time: "2021-01-13T02:36:02Z"
    - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
    f:status:
    f:conditions:
    k:{"type":"ContainersReady"}:
    .: {}
    f:lastProbeTime: {}
    f:lastTransitionTime: {}
    f:status: {}
    f:type: {}
    k:{"type":"Initialized"}:
    .: {}
    f:lastProbeTime: {}
    f:lastTransitionTime: {}
    f:status: {}
    f:type: {}
    k:{"type":"Ready"}:
    .: {}
    f:lastProbeTime: {}
    f:lastTransitionTime: {}
    f:status: {}
    f:type: {}
    f:containerStatuses: {}
    f:hostIP: {}
    f:phase: {}
    f:podIP: {}
    f:podIPs:
    .: {}
    k:{"ip":"10.40.0.4"}:
    .: {}
    f:ip: {}
    f:startTime: {}
    manager: kubelet
    operation: Update
    time: "2021-01-13T02:36:11Z"
    name: my-cmd # pod name
    namespace: default # pod The namespace in which you live
    resourceVersion: "418695" # pod Version number of , For optimistic concurrency control , Please refer to the following for details k8s The core principle
    uid: 12e3b858-f79f-4378-8ea0-1103ea120c34 # pod Example of uid
    spec: # pod The actual explanation of
    containers: # Definition pod In the container , There's only one
    - image: 192.168.80.84:5000/centos_cmd:v1 # Mirror address
    imagePullPolicy: IfNotPresent # mirrored pull The rules , It's about whether you're creating pod When it's time to pull Mirror image ,IdNotPresent It means to go to the warehouse only when the local does not exist pull
    name: my-cmd # Container name , That is, the name after the image is transformed into a container
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts: # Mount the volume
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount # Mount path
    name: default-token-s9dfj # Volume name , What's mounted here is actually every pod It'll be mounted secret volume , Used for authentication
    readOnly: true # read-only
    dnsPolicy: ClusterFirst
    enableServiceLinks: true
    nodeName: k8s-node02 # Nodes assigned to , Specified by the scheduler
    preemptionPolicy: PreemptLowerPriority
    priority: 0
    restartPolicy: Always # Designated as pod Restart time , Whether the container will still start , In fact, that is to develop the container with Pod Start while start
    schedulerName: default-scheduler # Specify the scheduler ,k8s Multiple scheduler instances can be run in , If not specified, the default scheduler
    securityContext: {}
    serviceAccount: default # Service account number
    serviceAccountName: default
    terminationGracePeriodSeconds: 30
    tolerations:
    - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
    - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
    volumes: # volume
    - name: default-token-s9dfj
    secret:
    defaultMode: 420
    secretName: default-token-s9dfj
    status: # pod Running state
    conditions:
    - lastProbeTime: null
    lastTransitionTime: "2021-01-13T02:36:02Z"
    status: "True"
    type: Initialized
    - lastProbeTime: null
    lastTransitionTime: "2021-01-13T02:36:10Z"
    status: "True"
    type: Ready
    - lastProbeTime: null
    lastTransitionTime: "2021-01-13T02:36:10Z"
    status: "True"
    type: ContainersReady
    - lastProbeTime: null
    lastTransitionTime: "2021-01-13T02:36:02Z"
    status: "True"
    type: PodScheduled
    containerStatuses:
    - containerID: docker://965a9b86cc334705d3fbaac15d28ef6b0a20de8f00915c1ffdf4c025b1c29206
    image: 192.168.80.84:5000/centos_cmd:v1
    imageID: docker-pullable://192.168.80.84:5000/centos_cmd@sha256:948479967390e7a98979d4b98beec6dfa3fc92c6ce832ece882e8b1843e0779f
    lastState: {}
    name: my-cmd
    ready: true
    restartCount: 0
    started: true
    state:
    running:
    startedAt: "2021-01-13T02:36:09Z"
    hostIP: 192.168.80.83
    phase: Running
    podIP: 10.40.0.4
    podIPs:
    - ip: 10.40.0.4
    qosClass: BestEffort
    startTime: "2021-01-13T02:36:02Z"
    

    You can find a lot of things in it , But we use yaml File creation pod You don't have to write so much when you're writing , because API server Will help us add the rest of the default values


    Use yaml File manually create a pod:

    apiVersion: v1
    kind: Pod
    metadata:
    name: my-cmd
    spec:
    containers:
    - image: 192.168.80.84:5000/centos_cmd:v1
    name: centos-cmd
    # It should be noted that spec.containers Medium name Field , The naming rules and pod The naming rules are the same , That is, if "my_cmd" May be an error
    # Second, pay attention to "Pod" Of “P” Use capital letters
    

    Let's take a look at the creation of pod Of yaml file :kubectl create -f my-cmd.yaml, We can go through kubectl get pod my-cmd -o yaml Let's take a look at the pod

    [root@k8s-master01 centos]# kubectl get pod my-cmd -o yaml
    apiVersion: v1
    kind: Pod
    metadata:
    creationTimestamp: "2021-01-13T03:32:42Z"
    managedFields:
    - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
    f:spec:
    f:containers:
    k:{"name":"my-cmd"}:
    .: {}
    f:image: {}
    f:imagePullPolicy: {}
    f:name: {}
    f:resources: {}
    f:terminationMessagePath: {}
    f:terminationMessagePolicy: {}
    f:dnsPolicy: {}
    f:enableServiceLinks: {}
    f:restartPolicy: {}
    f:schedulerName: {}
    f:securityContext: {}
    f:terminationGracePeriodSeconds: {}
    manager: kubectl-create # There's a different way of starting up here , Because we are through create The way to create pod
    operation: Update
    time: "2021-01-13T03:32:42Z"
    - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
    f:status:
    f:conditions:
    k:{"type":"ContainersReady"}:
    .: {}
    f:lastProbeTime: {}
    f:lastTransitionTime: {}
    f:status: {}
    f:type: {}
    k:{"type":"Initialized"}:
    .: {}
    f:lastProbeTime: {}
    f:lastTransitionTime: {}
    f:status: {}
    f:type: {}
    k:{"type":"Ready"}:
    .: {}
    f:lastProbeTime: {}
    f:lastTransitionTime: {}
    f:status: {}
    f:type: {}
    f:containerStatuses: {}
    f:hostIP: {}
    f:phase: {}
    f:podIP: {}
    f:podIPs:
    .: {}
    k:{"ip":"10.40.0.4"}:
    .: {}
    f:ip: {}
    f:startTime: {}
    manager: kubelet
    operation: Update
    time: "2021-01-13T04:39:23Z"
    name: my-cmd
    namespace: default
    resourceVersion: "429073"
    uid: 15d9f4f2-1fc8-4595-a00e-f96f52038ef9
    spec:
    containers:
    - image: 192.168.80.84:5000/centos_cmd:v1
    imagePullPolicy: IfNotPresent
    name: my-cmd
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
    name: default-token-s9dfj
    readOnly: true
    dnsPolicy: ClusterFirst
    enableServiceLinks: true
    nodeName: k8s-node02
    preemptionPolicy: PreemptLowerPriority
    priority: 0
    restartPolicy: Always
    schedulerName: default-scheduler
    securityContext: {}
    serviceAccount: default
    serviceAccountName: default
    terminationGracePeriodSeconds: 30
    tolerations:
    - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
    - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
    volumes:
    - name: default-token-s9dfj
    secret:
    defaultMode: 420
    secretName: default-token-s9dfj
    status:
    conditions:
    - lastProbeTime: null
    lastTransitionTime: "2021-01-13T03:32:42Z"
    status: "True"
    type: Initialized
    - lastProbeTime: null
    lastTransitionTime: "2021-01-13T04:39:23Z"
    status: "True"
    type: Ready
    - lastProbeTime: null
    lastTransitionTime: "2021-01-13T04:39:23Z"
    status: "True"
    type: ContainersReady
    - lastProbeTime: null
    lastTransitionTime: "2021-01-13T03:32:42Z"
    status: "True"
    type: PodScheduled
    containerStatuses:
    - containerID: docker://d7fee9118b0d5d2ccaa346d4cd97130a9f744e9bf6ee1b1ae32dfa0e583c2b41
    image: 192.168.80.84:5000/centos_cmd:v1
    imageID: docker-pullable://192.168.80.84:5000/centos_cmd@sha256:948479967390e7a98979d4b98beec6dfa3fc92c6ce832ece882e8b1843e0779f
    lastState:
    terminated:
    containerID: docker://0e6a82fe9e50924b7254fe06f131e43f3f66d8007de5524e31af38c6abd05d51
    exitCode: 0
    finishedAt: "2021-01-13T04:39:21Z"
    reason: Completed
    startedAt: "2021-01-13T04:22:42Z"
    name: my-cmd
    ready: true
    restartCount: 4
    started: true
    state:
    running:
    startedAt: "2021-01-13T04:39:22Z"
    hostIP: 192.168.80.83
    phase: Running
    podIP: 10.40.0.4
    podIPs:
    - ip: 10.40.0.4
    qosClass: BestEffort
    startTime: "2021-01-13T03:32:42Z"
    # If the meaning of a field is not clear , have access to "kubectl explain" To see the meaning of a field
    
  2. Forward ports in the local network to pod Port in

    First, we can use a nginx Mirror image :

    # I've already put nginx:alpine The mirror image of is pushed to the local warehouse
    About alpine edition
    Earlier alpine Version of the mirror, and this note , But then most of them were deleted , I wish to record
    ​```
    postgres:<version>-alpine
    This image is based on the popular Alpine Linux project, available in the alpine official image. Alpine Linux is much smaller than most distribution base images (~5MB), and thus leads to much slimmer images in general.
    This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use musl libc instead of glibc and friends, so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. See this Hacker News comment thread for more discussion of the issues that might arise and some pro/con comparisons of using Alpine-based images.
    To minimize image size, it's uncommon for additional related tools (such as git or bash) to be included in Alpine-based images. Using this image as a base, add the things you need in your own Dockerfile (see the alpine image description for examples of how to install packages if you are unfamiliar).
    ​```
    

kubectl port-forward mynginx 8000:8080

This is port forwarding , Allow us not to pass service The way to communicate with a particular pod communicate


3. Stop and remove Pod
```kubectl delete <podName>```
***
### Use labels to organize pod
> The label is also k8s One of the most important concepts in resources , Many functions need to rely on tag selectors
1. yaml The label is specified in the file
```yaml
apiVersion: v1
kind: Pod
metadata:
name: mynginx
labels: # A resource can be assigned multiple tags
app: nginx
rel: alpine
spec:
......
  1. Show tags when viewing resources

    The label is not displayed when the resource is viewed normally , adopt -o wide We can see pod The node and pod Of ip, And by “--show labels” Parameters , We can see the label of the resource

    [root@k8s-master01 centos]# kubectl get po --show-labels
    NAME READY STATUS RESTARTS AGE LABELS
    getname-deploy-68bd4cc6b4-j7gxz 1/1 Running 4 6d21h app=getname,pod-template-hash=68bd4cc6b4
    getname-deploy-68bd4cc6b4-pt2cb 1/1 Running 4 6d21h app=getname,pod-template-hash=68bd4cc6b4
    getname-deploy-68bd4cc6b4-srqfn 1/1 Running 4 6d21h app=getname,pod-template-hash=68bd4cc6b4
    my-cmd-labels 1/1 Running 0 11s app=nginx,rel=alpine # Here's what I just tagged pod
    # You may find that I have three labeled ones in front of me pod, These three pod I didn't create it this way
    # In fact, these three pod It's one I created rs Created
    # So the label is k8s There's a lot of use in managing resources
    
  2. View the specified label

    We may only be interested in some labels , Then we can pass “-L < Tag key name >” To display only the specified label

    [root@k8s-master01 centos]# kubectl get po -L app
    NAME READY STATUS RESTARTS AGE APP
    getname-deploy-68bd4cc6b4-j7gxz 1/1 Running 4 6d21h getname
    getname-deploy-68bd4cc6b4-pt2cb 1/1 Running 4 6d21h getname
    getname-deploy-68bd4cc6b4-srqfn 1/1 Running 4 6d21h getname
    my-cmd-labels 1/1 Running 0 6m46s nginx
    
  3. Modify the existing label

    # Use kubectl label <resourceName> <instanceName> <labelKey>=<labelValue>,<labelKey>=<labelValue> To add a new tag
    [root@k8s-master01 centos]# kubectl label po my-cmd-labels node=node1
    pod/my-cmd-labels labeled
    [root@k8s-master01 centos]# kubectl get po --show-labels
    NAME READY STATUS RESTARTS AGE LABELS
    my-cmd-labels 1/1 Running 0 11m app=nginx,node=node1,rel=alpine # Found that new tags have been added
    # The old label needs to be modified , You want to add “--overwrite” Parameters
    [root@k8s-master01 centos]# kubectl label po my-cmd-labels rel=stable --overwrite
    pod/my-cmd-labels labeled
    [root@k8s-master01 centos]# kubectl get po --show-labels
    NAME READY STATUS RESTARTS AGE LABELS
    fortune-env 2/2 Running 8 7d4h <none>
    my-cmd-labels 1/1 Running 0 13m app=nginx,node=node1,rel=stable # Find out rel The label has been rewritten
    
  4. Use the tag selector to list expectations Pod

    Can we just display the specific tags pod Well

    # We can use "-l" Parameters , To use the label selector
    [root@k8s-master01 centos]# kubectl get po -l rel=stable --show-labels
    NAME READY STATUS RESTARTS AGE LABELS
    my-cmd-labels 1/1 Running 1 20m app=nginx,node=node1,rel=stable
    Tag selectors, of course, don't only filter resources based on specific tag pairs
    # We can just specify the label key, This will display all the resources that contain the tag
    [root@k8s-master01 centos]# kubectl get po -l app --show-labels
    NAME READY STATUS RESTARTS AGE LABELS
    getname-deploy-68bd4cc6b4-j7gxz 1/1 Running 4 6d21h app=getname,pod-template-hash=68bd4cc6b4
    getname-deploy-68bd4cc6b4-pt2cb 1/1 Running 4 6d21h app=getname,pod-template-hash=68bd4cc6b4
    getname-deploy-68bd4cc6b4-srqfn 1/1 Running 4 6d21h app=getname,pod-template-hash=68bd4cc6b4
    my-cmd-labels 1/1 Running 1 24m app=nginx,node=node1,rel=stable
    # We can use != or ! To filter resources that do not contain a label or a label pair
    # It should be noted that , When you use symbols in filters , You should put quotation marks around , otherwise shell Can't understand what you want to do
    [root@k8s-master01 centos]# kubectl get po -l '!node' --show-labels
    NAME READY STATUS RESTARTS AGE LABELS
    fortune-env 2/2 Running 8 7d4h <none>
    getname-deploy-68bd4cc6b4-j7gxz 1/1 Running 4 6d21h app=getname,pod-template-hash=68bd4cc6b4
    getname-deploy-68bd4cc6b4-pt2cb 1/1 Running 4 6d21h app=getname,pod-template-hash=68bd4cc6b4
    getname-deploy-68bd4cc6b4-srqfn 1/1 Running 4 6d21h app=getname,pod-template-hash=68bd4cc6b4
    [root@k8s-master01 centos]# kubectl get po -l "app!=getname" --show-labels
    NAME READY STATUS RESTARTS AGE LABELS
    my-cmd-labels 1/1 Running 1 27m app=nginx,node=node1,rel=stable
    # We can also use in () and notin() For more complex filtering of tag pairs
    [root@k8s-master01 centos]# kubectl get po -l "app in (nginx)" --show-labels
    NAME READY STATUS RESTARTS AGE LABELS
    my-cmd-labels 1/1 Running 1 30m app=nginx,node=node1,rel=stable
    [root@k8s-master01 centos]# kubectl get po -l "app notin (getname)" --show-labels
    NAME READY STATUS RESTARTS AGE LABELS
    my-cmd-labels 1/1 Running 1 31m app=nginx,node=node1,rel=stable
    # More than one condition at a time , Use “,” Division
    [root@k8s-master01 centos]# kubectl get po -l app=nginx,node=node1 --show-labels
    NAME READY STATUS RESTARTS AGE LABELS
    my-cmd-labels 1/1 Running 1 32m app=nginx,node=node1,rel=stable
    

Use the tag selector to pod Schedule to specified node

In the previous section, you wrote that you can label resources , and k8s The node is also a resource , We can label nodes to pod Run to the specified node

# Label the nodes first
[root@k8s-master01 centos]# kubectl label node k8s-node01 node=node1
node/k8s-node01 labeled
[root@k8s-master01 centos]# kubectl label node k8s-node02 node=node2
node/k8s-node02 labeled
# Let's have a look at
[root@k8s-master01 centos]# kubectl get node -L node
NAME STATUS ROLES AGE VERSION NODE
k8s-master01 Ready control-plane,master 18d v1.20.1
k8s-node01 Ready <none> 18d v1.20.1 node1
k8s-node02 Ready <none> 18d v1.20.1 node2
# Now the node has successfully given two node It's labeled

Now let's Edit yaml file , to pod Assign to a specified node

apiVersion: v1
kind: Pod
metadata:
name: my-cmd-node1
spec:
nodeSelector: # Set up a node selector here
node: "node1" # Will only be assigned to node tags containing “node=node1” Node
containers:
- name: my-cmd-node1
image: 192.168.80.84:5000/centos_cmd:v1
--- # In a yaml You can use “---” Create multiple resources at once
apiVersion: v1
kind: Pod
metadata:
name: my-cmd-node2
spec:
nodeSelector:
node: "node2"
containers:
- name: my-cmd-node2
image: 192.168.80.84:5000/centos_cmd:v1

Take a look at the execution results

[root@k8s-master01 centos]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-cmd-node1 1/1 Running 0 12s 10.32.0.8 k8s-node01 <none> <none>
my-cmd-node2 1/1 Running 0 12s 10.40.0.6 k8s-node02 <none> <none>
# Find the default pod It's really assigned to the expected node On

About namespace

A namespace is a kind of scope at a higher level above a resource

This allows us to use the same resource name multiple times , It can also isolate some system level resources from user level resources

  1. View namespace

    A namespace is also a resource , We can also use it get Check it out.

    # have access to ns To simplify namespace
    [root@k8s-master01 centos]# kubectl get ns
    NAME STATUS AGE
    default Active 18d
    kube-node-lease Active 18d
    kube-public Active 18d
    kube-system Active 18d
    # have access to "-n <namespaceName>" To specify the namespace
    [root@k8s-master01 centos]# kubectl get po -n kube-system
    NAME READY STATUS RESTARTS AGE
    coredns-7f89b7bc75-9z9g8 1/1 Running 13 18d
    coredns-7f89b7bc75-dmhjl 1/1 Running 13 18d
    etcd-k8s-master01 1/1 Running 26 18d
    kube-apiserver-k8s-master01 1/1 Running 26 18d
    kube-controller-manager-k8s-master01 1/1 Running 30 18d
    kube-proxy-s2rmh 1/1 Running 13 18d
    kube-proxy-wq2kz 1/1 Running 13 18d
    kube-proxy-wvcgk 1/1 Running 24 18d
    kube-scheduler-k8s-master01 1/1 Running 26 18d
    weave-net-9lhgf 2/2 Running 37 18d
    weave-net-dhv26 2/2 Running 36 18d
    weave-net-q95gm 2/2 Running 65 18d
    # It can also be seen here that k8s One of the principles , namely :
    # k8s It's just node Of kubelet In the form of actual processes , Everything else is based on pod There is a form of
    # Here you can see etcd、apiserver、proxy、schedule、controller etc.
    
  2. Create a namespace

    You can use the command kubectl create namespace <namespaceName> To create a namespace

    You can also write yaml How to file

    apiVersion: v1
    kind: Namespace
    metadata:
    name: custom-namespace
    # And then use kubectl create -f To create
    
  3. Specify the namespace to create the object

    By default, we are default Create resources in , adopt “-n ” To specify the namespace

  4. Use the tag selector to delete pod

    # Still through "-l" To specify the tag selector
    kubectl delete pod -l "app=nginx"
    
  5. Delete the entire namespace

    kubectl delete ns <namespaceName>

    After deleting the namespace , Will delete all the resources in it

  6. Delete all pod, Preserve the namespace

    kubectl delete po -all -ns <namespaceName>

  7. Delete all resources in the namespace , Preserve the namespace

    kubectl delete all -all -ns <namespaceName>

版权声明
本文为[I only hope to have a white head]所创,转载请带上原文链接,感谢
https://javamana.com/2021/02/20210223140636622r.html

  1. Lazy load lazy load of SAP ui5 JavaScript files
  2. Add filter and execute filter in excel by Java
  3. Liteos: inventory those important data structures
  4. HDFS依然是存储的王者
  5. [MySQL]事务的MVCC原理与幻读
  6. 93.7%的程序员!竟然都不知道Redis为什么默认16个数据库?
  7. Java 集合处理/ 空值处理/ 异常处理,使用心得分享!
  8. Spring Authorization Server 全新授权服务器整合使用
  9. Spring Security 实战干货:OAuth2登录获取Token的核心逻辑
  10. Java中各种锁的原理解析
  11. java的byte和C#的byte的不同之处
  12. Java 在Excel中添加筛选器并执行筛选
  13. HDFS is still the king of storage
  14. Mvcc principle and unreal reading of [MySQL] transaction
  15. 93.7% of programmers! Why does redis default to 16 databases?
  16. Java collection processing / null value processing / exception processing, use experience sharing!
  17. Integrated use of new authorization server of spring authorization server
  18. Spring security real combat dry goods: the core logic of oauth2 login to obtain token
  19. Principle analysis of various locks in Java
  20. Differences between Java byte and C byte
  21. Add filter and execute filter in excel by Java
  22. Dialogue in spring
  23. 解决Docker MySQL无法被宿主机访问的问题
  24. Oracle OCP 19c 认证1Z0-083考试题库(第1题)
  25. Solve the problem that docker MySQL cannot be accessed by the host
  26. Oracle OCP 19C certification 1z0-083 examination question bank (question 1)
  27. 在 2021 年你需要掌握的 7 种关于 JavaScript 的数组方法
  28. Seven array methods for JavaScript you need to master in 2021
  29. 在 2021 年你需要掌握的 7 种关于 JavaScript 的数组方法
  30. Struts2 + Json _ 配置,异常解决及深入了解Struts2返回JSON数据的原理及具体应用范例
  31. Seven array methods for JavaScript you need to master in 2021
  32. Struts2 + Json _ Configuration, exception resolution and in-depth understanding of Struts2 return JSON data principle and specific application examples
  33. (三)MySQL锁机制 + 事务
  34. (3) MySQL lock mechanism + transaction
  35. 在 2021 年你需要掌握的 7 种关于 JavaScript 的数组方法
  36. Seven array methods for JavaScript you need to master in 2021
  37. 基于Kafka和Elasticsearch构建实时站内搜索功能的实践
  38. Practice of building real time search function in the website based on Kafka and elasticsearch
  39. Golang 实现 Redis(9): 使用GeoHash 搜索附近的人
  40. RxHttp - 轻量级、可扩展、易使用、完美兼容MVVM、MVC架构的网络封装类库
  41. Golang 实现 Redis(9): 使用GeoHash 搜索附近的人
  42. RxHttp - 轻量级、可扩展、易使用、完美兼容MVVM、MVC架构的网络封装类库
  43. Golang realizes redis (9): using geohash to search nearby people
  44. Rxhttp - lightweight, extensible, easy to use, perfectly compatible with MVVM, MVC architecture network encapsulation class library
  45. Golang realizes redis (9): using geohash to search nearby people
  46. Rxhttp - lightweight, extensible, easy to use, perfectly compatible with MVVM, MVC architecture network encapsulation class library
  47. 读懂框架设计的灵魂 — Java 反射机制
  48. 治疗磁盘空间不足焦虑症,释放容器占用空间——Win10+docker篇
  49. 别再用jodatime了!全网最权威Java8日期时间类LocalDate、LocalDateTime详解
  50. Understanding the soul of framework design java reflection mechanism
  51. 配置客户端以安全连接到Apache Kafka集群4:TLS客户端身份验证
  52. Treating anxiety of insufficient disk space and releasing space occupied by containers -- win10 + docker
  53. Don't use jodatime any more! The most authoritative java 8 date and time classes in the whole network: detailed explanation of localdate and localdatetime
  54. Configure clients to connect securely to Apache Kafka Cluster 4: TLS client authentication
  55. Spring break
  56. 高性能MySQL(三):Schema与数据类型优化
  57. High performance mysql (3): schema and data type optimization
  58. redis解决缓存、击穿、雪崩
  59. redis
  60. 骑士卡:基于Kafka搭建消息中心,上亿消息推送轻松完成